/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package tests.api.java.io; import java.io.ByteArrayInputStream; import java.io.CharArrayReader; import java.io.IOException; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.Reader; import java.io.StreamTokenizer; import java.io.StringBufferInputStream; import java.io.StringReader; import junit.framework.Assert; import tests.support.Support_StringReader; import tests.support.Support_ASimpleInputStream; import dalvik.annotation.TestLevel; import dalvik.annotation.TestTargetClass; import dalvik.annotation.TestTargetNew; import dalvik.annotation.TestTargets; // TODO: most of the assertTrue calls in this test case should be // replaced with assertEquals (possibly two assertEquals) see // test_ConstructorLjava_io_InputStream for example. // This gives much more helpful error messages. @TestTargetClass(StreamTokenizer.class) public class StreamTokenizerTest extends junit.framework.TestCase { Support_StringReader r; StreamTokenizer st; String testString; /** * @tests java.io.StreamTokenizer#StreamTokenizer(java.io.InputStream) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "StreamTokenizer", args = {java.io.InputStream.class} ) public void test_ConstructorLjava_io_InputStream() throws IOException { st = new StreamTokenizer(new StringBufferInputStream( "/comments\n d 8 'h'")); assertEquals("the next token returned should be the letter d", StreamTokenizer.TT_WORD, st.nextToken()); assertEquals("the next token returned should be the letter d", "d", st.sval); assertEquals("the next token returned should be the digit 8", StreamTokenizer.TT_NUMBER, st.nextToken()); assertEquals("the next token returned should be the digit 8", 8.0, st.nval); assertEquals("the next token returned should be the quote character", 39, st.nextToken()); assertEquals("the next token returned should be the quote character", "h", st.sval); } /** * @tests java.io.StreamTokenizer#StreamTokenizer(java.io.Reader) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "StreamTokenizer", args = {java.io.Reader.class} ) public void test_ConstructorLjava_io_Reader() throws IOException { setTest("/testing\n d 8 'h' "); assertEquals("the next token returned should be the letter d skipping the comments", StreamTokenizer.TT_WORD, st.nextToken()); assertEquals("the next token returned should be the letter d", "d", st.sval); assertEquals("the next token returned should be the digit 8", StreamTokenizer.TT_NUMBER, st.nextToken()); assertEquals("the next token returned should be the digit 8", 8.0, st.nval); assertEquals("the next token returned should be the quote character", 39, st.nextToken()); assertEquals("the next token returned should be the quote character", "h", st.sval); } /** * @tests java.io.StreamTokenizer#commentChar(int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "commentChar", args = {int.class} ) public void test_commentCharI() throws IOException { setTest("*comment \n / 8 'h' "); st.ordinaryChar('/'); st.commentChar('*'); assertEquals("nextToken() did not return the character / skiping the comments starting with *", 47, st.nextToken()); assertTrue("the next token returned should be the digit 8", st .nextToken() == StreamTokenizer.TT_NUMBER && st.nval == 8.0); assertTrue("the next token returned should be the quote character", st.nextToken() == 39 && st.sval.equals("h")); } /** * @tests java.io.StreamTokenizer#eolIsSignificant(boolean) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "eolIsSignificant", args = {boolean.class} ) public void test_eolIsSignificantZ() throws IOException { setTest("d 8\n"); // by default end of line characters are not significant assertTrue("nextToken did not return d", st.nextToken() == StreamTokenizer.TT_WORD && st.sval.equals("d")); assertTrue("nextToken did not return 8", st.nextToken() == StreamTokenizer.TT_NUMBER && st.nval == 8.0); assertTrue("nextToken should be the end of file", st.nextToken() == StreamTokenizer.TT_EOF); setTest("d\n"); st.eolIsSignificant(true); // end of line characters are significant assertTrue("nextToken did not return d", st.nextToken() == StreamTokenizer.TT_WORD && st.sval.equals("d")); assertTrue("nextToken is the end of line", st.nextToken() == StreamTokenizer.TT_EOL); } /** * @tests java.io.StreamTokenizer#lineno() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "lineno", args = {} ) public void test_lineno() throws IOException { setTest("d\n 8\n"); assertEquals("the lineno should be 1", 1, st.lineno()); st.nextToken(); st.nextToken(); assertEquals("the lineno should be 2", 2, st.lineno()); st.nextToken(); assertEquals("the next line no should be 3", 3, st.lineno()); } /** * @tests java.io.StreamTokenizer#lowerCaseMode(boolean) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "lowerCaseMode", args = {boolean.class} ) public void test_lowerCaseModeZ() throws Exception { // SM. setTest("HELLOWORLD"); st.lowerCaseMode(true); st.nextToken(); assertEquals("sval not converted to lowercase.", "helloworld", st.sval ); } /** * @tests java.io.StreamTokenizer#nextToken() */ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, method = "nextToken", args = {} ) public void test_nextToken() throws IOException { setTest("\r\n/* fje fje 43.4 f \r\n f g */ 456.459 \r\n" + "Hello / \r\n \r\n \n \r \257 Hi \'Hello World\'"); st.ordinaryChar('/'); st.slashStarComments(true); st.nextToken(); assertTrue("Wrong Token type1: " + (char) st.ttype, st.ttype == StreamTokenizer.TT_NUMBER); st.nextToken(); assertTrue("Wrong Token type2: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD); st.nextToken(); assertTrue("Wrong Token type3: " + st.ttype, st.ttype == '/'); st.nextToken(); assertTrue("Wrong Token type4: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD); st.nextToken(); assertTrue("Wrong Token type5: " + st.ttype, st.ttype == StreamTokenizer.TT_WORD); st.nextToken(); assertTrue("Wrong Token type6: " + st.ttype, st.ttype == '\''); assertTrue("Wrong Token type7: " + st.ttype, st.sval .equals("Hello World")); st.nextToken(); assertTrue("Wrong Token type8: " + st.ttype, st.ttype == -1); final PipedInputStream pin = new PipedInputStream(); PipedOutputStream pout = new PipedOutputStream(pin); pout.write("hello\n\r\r".getBytes()); st = new StreamTokenizer(pin); st.eolIsSignificant(true); assertTrue("Wrong token 1,1", st.nextToken() == StreamTokenizer.TT_WORD && st.sval.equals("hello")); assertTrue("Wrong token 1,2", st.nextToken() == '\n'); assertTrue("Wrong token 1,3", st.nextToken() == '\n'); assertTrue("Wrong token 1,4", st.nextToken() == '\n'); pout.close(); assertTrue("Wrong token 1,5", st.nextToken() == StreamTokenizer.TT_EOF); st = new StreamTokenizer(new Support_StringReader("\n \r\n#")); st.ordinaryChar('\n'); // make \n ordinary st.eolIsSignificant(true); assertTrue("Wrong token 2,1", st.nextToken() == '\n'); assertTrue("Wrong token 2,2", st.nextToken() == '\n'); assertEquals("Wrong token 2,3", '#', st.nextToken()); Support_ASimpleInputStream sis = new Support_ASimpleInputStream(); sis.throwExceptionOnNextUse = true; st = new StreamTokenizer(sis); try { st.nextToken(); fail("IOException expected."); } catch (IOException e) { // Expected. } } /** * @tests java.io.StreamTokenizer#ordinaryChar(int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "ordinaryChar", args = {int.class} ) public void test_ordinaryCharI() throws IOException { // SM. setTest("Ffjein 893"); st.ordinaryChar('F'); st.nextToken(); assertTrue("OrdinaryChar failed." + (char) st.ttype, st.ttype == 'F'); } /** * @tests java.io.StreamTokenizer#ordinaryChars(int, int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "ordinaryChars", args = {int.class, int.class} ) public void test_ordinaryCharsII() throws IOException { // SM. setTest("azbc iof z 893"); st.ordinaryChars('a', 'z'); assertEquals("OrdinaryChars failed.", 'a', st.nextToken()); assertEquals("OrdinaryChars failed.", 'z', st.nextToken()); } /** * @tests java.io.StreamTokenizer#parseNumbers() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "parseNumbers", args = {} ) public void test_parseNumbers() throws IOException { // SM setTest("9.9 678"); assertTrue("Base behavior failed.", st.nextToken() == StreamTokenizer.TT_NUMBER); st.ordinaryChars('0', '9'); assertEquals("setOrdinary failed.", '6', st.nextToken()); st.parseNumbers(); assertTrue("parseNumbers failed.", st.nextToken() == StreamTokenizer.TT_NUMBER); } /** * @tests java.io.StreamTokenizer#pushBack() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "pushBack", args = {} ) public void test_pushBack() throws IOException { // SM. setTest("Hello 897"); st.nextToken(); st.pushBack(); assertTrue("PushBack failed.", st.nextToken() == StreamTokenizer.TT_WORD); } /** * @tests java.io.StreamTokenizer#quoteChar(int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "quoteChar", args = {int.class} ) public void test_quoteCharI() throws IOException { // SM setTest("<Hello World< HelloWorldH"); st.quoteChar('<'); assertEquals("QuoteChar failed.", '<', st.nextToken()); assertEquals("QuoteChar failed.", "Hello World", st.sval); st.quoteChar('H'); st.nextToken(); assertEquals("QuoteChar failed for word.", "elloWorld", st.sval ); } /** * @tests java.io.StreamTokenizer#resetSyntax() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "resetSyntax", args = {} ) public void test_resetSyntax() throws IOException { // SM setTest("H 9\' ello World"); st.resetSyntax(); assertTrue("resetSyntax failed1." + (char) st.ttype, st.nextToken() == 'H'); assertTrue("resetSyntax failed1." + (char) st.ttype, st.nextToken() == ' '); assertTrue("resetSyntax failed2." + (char) st.ttype, st.nextToken() == '9'); assertTrue("resetSyntax failed3." + (char) st.ttype, st.nextToken() == '\''); } /** * @tests java.io.StreamTokenizer#slashSlashComments(boolean) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "slashSlashComments", args = {boolean.class} ) public void test_slashSlashCommentsZ() throws IOException { // SM. setTest("// foo \r\n /fiji \r\n -456"); st.ordinaryChar('/'); st.slashSlashComments(true); assertEquals("Test failed.", '/', st.nextToken()); assertTrue("Test failed.", st.nextToken() == StreamTokenizer.TT_WORD); } /** * @tests java.io.StreamTokenizer#slashSlashComments(boolean) */ @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "slashSlashComments", args = {boolean.class} ) public void test_slashSlashComments_withSSOpen() throws IOException { Reader reader = new CharArrayReader( "t // t t t".toCharArray()); StreamTokenizer st = new StreamTokenizer(reader); st.slashSlashComments(true); assertEquals(StreamTokenizer.TT_WORD,st.nextToken()); assertEquals(StreamTokenizer.TT_EOF,st.nextToken()); } /** * @tests java.io.StreamTokenizer#slashSlashComments(boolean) */ @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "slashSlashComments", args = {boolean.class} ) public void test_slashSlashComments_withSSOpen_NoComment() throws IOException { Reader reader = new CharArrayReader( "// t".toCharArray()); StreamTokenizer st = new StreamTokenizer(reader); st.slashSlashComments(true); st.ordinaryChar('/'); assertEquals(StreamTokenizer.TT_EOF,st.nextToken()); } /** * @tests java.io.StreamTokenizer#slashSlashComments(boolean) */ @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "slashSlashComments", args = {boolean.class} ) public void test_slashSlashComments_withSSClosed() throws IOException { Reader reader = new CharArrayReader( "// t".toCharArray()); StreamTokenizer st = new StreamTokenizer(reader); st.slashSlashComments(false); st.ordinaryChar('/'); assertEquals('/',st.nextToken()); assertEquals('/',st.nextToken()); assertEquals(StreamTokenizer.TT_WORD,st.nextToken()); } /** * @tests java.io.StreamTokenizer#slashStarComments(boolean) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "slashStarComments", args = {boolean.class} ) public void test_slashStarCommentsZ() throws IOException { setTest("/* foo \r\n /fiji \r\n*/ -456"); st.ordinaryChar('/'); st.slashStarComments(true); assertTrue("Test failed.", st.nextToken() == StreamTokenizer.TT_NUMBER); } /** * @tests java.io.StreamTokenizer#slashStarComments(boolean) */ @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "slashStarComments", args = {boolean.class} ) public void test_slashStarComments_withSTOpen() throws IOException { Reader reader = new CharArrayReader( "t /* t */ t".toCharArray()); StreamTokenizer st = new StreamTokenizer(reader); st.slashStarComments(true); assertEquals(StreamTokenizer.TT_WORD,st.nextToken()); assertEquals(StreamTokenizer.TT_WORD,st.nextToken()); assertEquals(StreamTokenizer.TT_EOF,st.nextToken()); } /** * @tests java.io.StreamTokenizer#slashStarComments(boolean) */ @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "slashStarComments", args = {boolean.class} ) public void test_slashStarComments_withSTClosed() throws IOException { Reader reader = new CharArrayReader( "t /* t */ t".toCharArray()); StreamTokenizer st = new StreamTokenizer(reader); st.slashStarComments(false); assertEquals(StreamTokenizer.TT_WORD,st.nextToken()); assertEquals(StreamTokenizer.TT_EOF,st.nextToken()); } /** * @tests java.io.StreamTokenizer#toString() */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "toString", args = {} ) public void test_toString() throws IOException { setTest("ABC Hello World"); st.nextToken(); assertTrue("toString failed." + st.toString(), st.toString().equals( "Token[ABC], line 1")); } /** * @tests java.io.StreamTokenizer#whitespaceChars(int, int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "whitespaceChars", args = {int.class, int.class} ) public void test_whitespaceCharsII() throws IOException { setTest("azbc iof z 893"); st.whitespaceChars('a', 'z'); assertTrue("OrdinaryChar failed.", st.nextToken() == StreamTokenizer.TT_NUMBER); } /** * @tests java.io.StreamTokenizer#wordChars(int, int) */ @TestTargetNew( level = TestLevel.COMPLETE, notes = "", method = "wordChars", args = {int.class, int.class} ) public void test_wordCharsII() throws IOException { setTest("A893 -9B87"); st.wordChars('0', '9'); assertTrue("WordChar failed1.", st.nextToken() == StreamTokenizer.TT_WORD); assertEquals("WordChar failed2.", "A893", st.sval); assertTrue("WordChar failed3.", st.nextToken() == StreamTokenizer.TT_NUMBER); st.nextToken(); assertEquals("WordChar failed4.", "B87", st.sval); setTest(" Hello World"); st.wordChars(' ', ' '); st.nextToken(); assertEquals("WordChars failed for whitespace.", "Hello World", st.sval ); setTest(" Hello World\r\n \'Hello World\' Hello\' World"); st.wordChars(' ', ' '); st.wordChars('\'', '\''); st.nextToken(); assertTrue("WordChars failed for whitespace: " + st.sval, st.sval .equals("Hello World")); st.nextToken(); assertTrue("WordChars failed for quote1: " + st.sval, st.sval .equals("\'Hello World\' Hello\' World")); } private void setTest(String s) { testString = s; r = new Support_StringReader(testString); st = new StreamTokenizer(r); } protected void setUp() { } protected void tearDown() { } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "lineno", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "General functionality of these methods tested in separate tests.", method = "nextToken", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "toString", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "commentChar", args = {int.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "eolIsSignificant", args = {boolean.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "lowerCaseMode", args = {boolean.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "ordinaryChar", args = {int.class} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "General functionality of these methods tested in separate tests.", method = "slashStarComments", args = {boolean.class} ) }) public void test_basicStringTokenizerMethods() { String str = "Testing 12345 \n alpha \r\n omega"; String strb = "-3.8 'BLIND mice' \r sEe /* how */ they run"; StringReader aa = new StringReader(str); StringReader ba = new StringReader(strb); StreamTokenizer a = new StreamTokenizer(aa); StreamTokenizer b = new StreamTokenizer(ba); try { Assert.assertTrue(a.lineno() == 1); Assert.assertTrue(a.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(a.toString().equals("Token[Testing], line 1")); Assert.assertTrue(a.nextToken() == StreamTokenizer.TT_NUMBER); Assert.assertTrue(a.toString().equals("Token[n=12345.0], line 1")); Assert.assertTrue(a.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(a.toString().equals("Token[alpha], line 2")); Assert.assertTrue(a.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(a.toString().equals("Token[omega], line 3")); Assert.assertTrue(a.nextToken() == StreamTokenizer.TT_EOF); Assert.assertTrue(a.toString().equals("Token[EOF], line 3")); b.commentChar('u'); b.eolIsSignificant(true); b.lowerCaseMode(true); b.ordinaryChar('y'); b.slashStarComments(true); Assert.assertTrue(b.nextToken() == StreamTokenizer.TT_NUMBER); Assert.assertTrue(b.nval == -3.8); Assert.assertTrue(b.toString().equals("Token[n=-3.8], line 1")); Assert.assertTrue(b.nextToken() == 39); // ' Assert.assertTrue(b.toString().equals("Token[BLIND mice], line 1")); Assert.assertTrue(b.nextToken() == 10); // \n Assert.assertTrue(b.toString().equals("Token[EOL], line 2")); Assert.assertTrue(b.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(b.toString().equals("Token[see], line 2")); Assert.assertTrue(b.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(b.toString().equals("Token[the], line 2")); Assert.assertTrue(b.nextToken() == 121); // y Assert.assertTrue(b.toString().equals("Token['y'], line 2")); Assert.assertTrue(b.nextToken() == StreamTokenizer.TT_WORD); Assert.assertTrue(b.toString().equals("Token[r], line 2")); Assert.assertTrue(b.nextToken() == StreamTokenizer.TT_EOF); Assert.assertTrue(b.toString().equals("Token[EOF], line 2")); } catch (Exception ex){ System.out.println("Exception found in StreamTokenizer"); ex.printStackTrace(); throw new RuntimeException("error in test, see stdout"); } } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "", method = "nextToken", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "toString", args = {} ) }) public void test_harmonyRegressionTest() { byte[] data = new byte[] {(byte) '-'}; StreamTokenizer tokenizer = new StreamTokenizer(new ByteArrayInputStream(data)); try { tokenizer.nextToken(); } catch(Exception e) { Assert.fail(e.getMessage()); } String result = tokenizer.toString(); Assert.assertEquals("Token['-'], line 1", result); } @TestTargets({ @TestTargetNew( level = TestLevel.PARTIAL_COMPLETE, notes = "", method = "nextToken", args = {} ), @TestTargetNew( level = TestLevel.PARTIAL, notes = "", method = "toString", args = {} ) }) public void test_harmonyRegressionTest2() { byte[] data = new byte[] {(byte) '"', (byte) 'H', (byte) 'e', (byte) 'l', (byte) 'l', (byte) 'o', (byte) '"'}; StreamTokenizer tokenizer = new StreamTokenizer(new ByteArrayInputStream(data)); try { tokenizer.nextToken(); } catch (Exception e) { e.printStackTrace(); } String result = tokenizer.toString(); Assert.assertEquals("Token[Hello], line 1", result); } }