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.ini4j.Config;
019    import org.ini4j.Ini;
020    import org.ini4j.Ini4jCase;
021    import org.ini4j.InvalidFileFormatException;
022    
023    import org.junit.Test;
024    
025    import java.nio.charset.Charset;
026    
027    public class UnicodeInputStreamReaderTest extends Ini4jCase
028    {
029        @Test public void _testUTF32BE() throws Exception
030        {
031            test("UTF-32BE.ini", "UTF-32BE");
032        }
033    
034        @Test public void _testUTF32BE_BOM() throws Exception
035        {
036            test("UTF-32BE-BOM.ini", null);
037            test("UTF-32BE-BOM.ini", "UTF-8");
038            test("UTF-32BE-BOM.ini", "UTF-16");
039        }
040    
041        @Test public void _testUTF32BE_fail() throws Exception
042        {
043            try
044            {
045                test("UTF-32BE.ini", "ISO-8859-1");
046                missing(IllegalStateException.class);
047            }
048            catch (IllegalStateException x)
049            {
050                //
051            }
052        }
053    
054        @Test public void _testUTF32LE() throws Exception
055        {
056            test("UTF-32LE.ini", "UTF-32LE");
057        }
058    
059        @Test public void _testUTF32LE_BOM() throws Exception
060        {
061            test("UTF-32LE-BOM.ini", null);
062            test("UTF-32LE-BOM.ini", "UTF-8");
063            test("UTF-32LE-BOM.ini", "UTF-16");
064        }
065    
066        @Test public void _testUTF32LE_fail() throws Exception
067        {
068            try
069            {
070                test("UTF-32LE.ini", "ISO-8859-1");
071                missing(IllegalStateException.class);
072            }
073            catch (IllegalStateException x)
074            {
075                //
076            }
077        }
078    
079        @Test public void t_e_s_tUTF16BE_fail() throws Exception
080        {
081            try
082            {
083                test("UTF-16BE.ini", "ISO-8859-1");
084                missing(IllegalStateException.class);
085            }
086            catch (IllegalStateException x)
087            {
088                //
089            }
090        }
091    
092        @Test public void t_e_s_tUTF16LE_fail() throws Exception
093        {
094            try
095            {
096                test("UTF-16LE.ini", "ISO-8859-1");
097                missing(IllegalStateException.class);
098            }
099            catch (IllegalStateException x)
100            {
101                //
102            }
103        }
104    
105        @Test public void testUTF16BE() throws Exception
106        {
107            test("UTF-16BE.ini", "UTF-16BE");
108        }
109    
110        @Test public void testUTF16BE_BOM() throws Exception
111        {
112            test("UTF-16BE-BOM.ini", null);
113            test("UTF-16BE-BOM.ini", "UTF-8");
114            test("UTF-16BE-BOM.ini", "UTF-16");
115        }
116    
117        @Test public void testUTF16LE() throws Exception
118        {
119            test("UTF-16LE.ini", "UTF-16LE");
120        }
121    
122        @Test public void testUTF16LE_BOM() throws Exception
123        {
124            test("UTF-16LE-BOM.ini", null);
125            test("UTF-16LE-BOM.ini", "UTF-8");
126            test("UTF-16LE-BOM.ini", "UTF-16");
127        }
128    
129        @Test public void testUTF8() throws Exception
130        {
131            test("UTF-8.ini", null);
132            test("UTF-8.ini", "UTF-8");
133        }
134    
135        @Test public void testUTF8_BOM() throws Exception
136        {
137            test("UTF-8-BOM.ini", null);
138            test("UTF-8-BOM.ini", "UTF-8");
139            test("UTF-8-BOM.ini", "UTF-16");
140        }
141    
142        @Test public void testUTF8_fail() throws Exception
143        {
144            try
145            {
146                test("UTF-8.ini", "UTF-16");
147                missing(InvalidFileFormatException.class);
148            }
149            catch (InvalidFileFormatException x)
150            {
151                //
152            }
153        }
154    
155        private UnicodeInputStreamReader instantiate(String filename, String defaultEncoding)
156        {
157            Charset charset = (defaultEncoding == null) ? Charset.defaultCharset() : Charset.forName(defaultEncoding);
158    
159            return new UnicodeInputStreamReader(getClass().getResourceAsStream(filename), charset);
160        }
161    
162        private void test(String filename, String defaultEncoding) throws Exception
163        {
164            Charset charset = (defaultEncoding == null) ? Config.DEFAULT_FILE_ENCODING : Charset.forName(defaultEncoding);
165            UnicodeInputStreamReader reader = new UnicodeInputStreamReader(getClass().getResourceAsStream(filename), charset);
166            Ini ini = new Ini();
167    
168            ini.setConfig(Config.getGlobal().clone());
169            ini.getConfig().setFileEncoding(charset);
170            ini.load(reader);
171            Ini.Section sec = ini.get("section");
172    
173            if (sec == null)
174            {
175                throw new IllegalStateException("Missing section: section");
176            }
177    
178            if (!"value".equals(sec.get("option")))
179            {
180                throw new IllegalStateException("Missing option: option");
181            }
182        }
183    }