001    /*
002     * Copyright (c) 2007 Henri Sivonen
003     *
004     * Permission is hereby granted, free of charge, to any person obtaining a 
005     * copy of this software and associated documentation files (the "Software"), 
006     * to deal in the Software without restriction, including without limitation 
007     * the rights to use, copy, modify, merge, publish, distribute, sublicense, 
008     * and/or sell copies of the Software, and to permit persons to whom the 
009     * Software is furnished to do so, subject to the following conditions:
010     *
011     * The above copyright notice and this permission notice shall be included in 
012     * all copies or substantial portions of the Software.
013     *
014     * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
015     * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
016     * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 
017     * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
018     * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
019     * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
020     * DEALINGS IN THE SOFTWARE.
021     */
022    
023    package nu.validator.htmlparser.test;
024    
025    import java.io.FileInputStream;
026    import java.io.IOException;
027    import java.io.InputStream;
028    import java.nio.charset.Charset;
029    
030    import nu.validator.htmlparser.impl.HtmlInputStreamReader;
031    
032    import org.xml.sax.SAXException;
033    
034    public class EncodingTester {
035    
036        private final InputStream aggregateStream;
037    
038        private final StringBuilder builder = new StringBuilder();
039    
040        /**
041         * @param aggregateStream
042         */
043        public EncodingTester(InputStream aggregateStream) {
044            this.aggregateStream = aggregateStream;
045        }
046    
047        private void runTests() throws IOException, SAXException {
048            while (runTest()) {
049                // spin
050            }
051        }
052    
053        private boolean runTest() throws IOException, SAXException {
054            if (skipLabel()) {
055                return false;
056            }
057            UntilHashInputStream stream = new UntilHashInputStream(aggregateStream);
058            HtmlInputStreamReader reader = new HtmlInputStreamReader(stream, null,
059                    null, null);
060            Charset charset = reader.getCharset();
061            stream.close();
062            if (skipLabel()) {
063                System.err.println("Premature end of test data.");
064                return false;
065            }
066            builder.setLength(0);
067            loop: for (;;) {
068                int b = aggregateStream.read();
069                switch (b) {
070                    case '\n':
071                        break loop;
072                    case -1:
073                        System.err.println("Premature end of test data.");
074                        return false;
075                    default:
076                        builder.append(((char) b));
077                }
078            }
079            String sniffed = charset.name();
080            String expected = builder.toString();
081            if (expected.equalsIgnoreCase(sniffed)) {
082                System.err.println("Success.");
083                // System.err.println(stream);
084            } else {
085                System.err.println("Failure. Expected: " + expected + " got "
086                        + sniffed + ".");
087                System.err.println(stream);
088            }
089            return true;
090        }
091    
092        private boolean skipLabel() throws IOException {
093            int b = aggregateStream.read();
094            if (b == -1) {
095                return true;
096            }
097            for (;;) {
098                b = aggregateStream.read();
099                if (b == -1) {
100                    return true;
101                } else if (b == 0x0A) {
102                    return false;
103                }
104            }
105        }
106    
107        /**
108         * @param args
109         * @throws SAXException
110         * @throws IOException
111         */
112        public static void main(String[] args) throws IOException, SAXException {
113            for (int i = 0; i < args.length; i++) {
114                EncodingTester tester = new EncodingTester(new FileInputStream(
115                        args[i]));
116                tester.runTests();
117            }
118        }
119    
120    }