001    /*
002     * Copyright 2005,2009 Ivan SZKIBA
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.ini4j.spi;
017    
018    import org.easymock.EasyMock;
019    
020    import org.ini4j.Config;
021    import org.ini4j.Ini4jCase;
022    
023    import org.ini4j.test.Helper;
024    
025    import static org.junit.Assert.assertEquals;
026    import static org.junit.Assert.assertNull;
027    
028    import org.junit.Test;
029    
030    import java.io.ByteArrayInputStream;
031    import java.io.InputStream;
032    
033    public class IniSourceTest extends Ini4jCase
034    {
035        private static final String COMMENTS = ";#";
036        private static final String NESTED_TXT = "nested.txt";
037        private static final String NESTED = ":" + NESTED_TXT;
038        private static final String NESTED_PATH = "org/ini4j/spi/" + NESTED_TXT;
039        private static final String INCLUDE = ":include.txt";
040        private static final String PART1 = ":part1.txt";
041        private static final String PART2 = ":part2.txt";
042        private static final String OUTER = ":outer";
043    
044        @Test public void testWithInclude() throws Exception
045        {
046            HandlerBase handler = EasyMock.createMock(HandlerBase.class);
047    
048            handler.handleComment("-1" + OUTER);
049            handler.handleComment("-1" + NESTED);
050            handler.handleComment("-2" + NESTED);
051            handler.handleComment("-1" + INCLUDE);
052            handler.handleComment("-2" + INCLUDE);
053            handler.handleComment("-1" + PART1);
054            handler.handleComment("-2" + PART1);
055            handler.handleComment("-3" + INCLUDE);
056            handler.handleComment("-4" + INCLUDE);
057            handler.handleComment("-5" + INCLUDE);
058            handler.handleComment("-6" + INCLUDE);
059            handler.handleComment("-1" + PART2);
060            handler.handleComment("-2" + PART2);
061            handler.handleComment("-7" + INCLUDE);
062            handler.handleComment("-8" + INCLUDE);
063            handler.handleComment("-3" + NESTED);
064            handler.handleComment("-4" + NESTED);
065            handler.handleComment("-2" + OUTER);
066            EasyMock.replay(handler);
067            StringBuilder outer = new StringBuilder();
068    
069            outer.append(";-1" + OUTER + '\n');
070            outer.append("1" + OUTER + '\n');
071            outer.append('<');
072            outer.append(Helper.getResourceURL(NESTED_PATH).toExternalForm());
073            outer.append(">\n");
074            outer.append("2" + OUTER + '\n');
075            outer.append(";-2" + OUTER + '\n');
076            InputStream in = new ByteArrayInputStream(outer.toString().getBytes());
077            Config cfg = new Config();
078    
079            cfg.setInclude(true);
080            IniSource src = new IniSource(in, handler, COMMENTS, cfg);
081    
082            assertEquals("1" + OUTER, src.readLine());
083            assertEquals(2, src.getLineNumber());
084            assertEquals("1" + NESTED, src.readLine());
085            assertEquals(2, src.getLineNumber());
086            assertEquals("1" + INCLUDE, src.readLine());
087            assertEquals(2, src.getLineNumber());
088            assertEquals("1" + PART1, src.readLine());
089            assertEquals(2, src.getLineNumber());
090            assertEquals("2" + PART1, src.readLine());
091            assertEquals(4, src.getLineNumber());
092            assertEquals("3" + PART1 + "\\\\", src.readLine());
093            assertEquals(5, src.getLineNumber());
094            assertEquals("4:\\\\part1.txt", src.readLine());
095            assertEquals(7, src.getLineNumber());
096            assertEquals("5" + PART1 + "\\\\\\\\", src.readLine());
097            assertEquals(8, src.getLineNumber());
098            assertEquals("6" + PART1 + ";", src.readLine());
099            assertEquals(10, src.getLineNumber());
100            assertEquals("2" + INCLUDE, src.readLine());
101            assertEquals(6, src.getLineNumber());
102            assertEquals("3" + INCLUDE, src.readLine());
103            assertEquals(10, src.getLineNumber());
104            assertEquals("1" + PART2, src.readLine());
105            assertEquals(3, src.getLineNumber());
106            assertEquals("4" + INCLUDE, src.readLine());
107            assertEquals(14, src.getLineNumber());
108            assertEquals("2" + NESTED, src.readLine());
109            assertEquals(6, src.getLineNumber());
110            assertEquals("2" + OUTER, src.readLine());
111            assertEquals(4, src.getLineNumber());
112            assertNull(src.readLine());
113            EasyMock.verify(handler);
114        }
115    
116        @Test public void testWithoutInclude() throws Exception
117        {
118            HandlerBase handler = EasyMock.createMock(HandlerBase.class);
119    
120            handler.handleComment("-1" + NESTED);
121            handler.handleComment("-2" + NESTED);
122            handler.handleComment("-3" + NESTED);
123            handler.handleComment("-4" + NESTED);
124            EasyMock.replay(handler);
125            Config cfg = new Config();
126    
127            cfg.setInclude(false);
128            IniSource src = new IniSource(Helper.getResourceURL(NESTED_PATH), handler, COMMENTS, cfg);
129    
130            assertEquals("1" + NESTED, src.readLine());
131            assertEquals("<include.txt>", src.readLine());
132            assertEquals("2" + NESTED, src.readLine());
133            assertNull(src.readLine());
134            EasyMock.verify(handler);
135        }
136    }