コード例 #1
0
// Scanner Test
void
MimeSnifferTest::ScannerTest() {
#if TEST_R5
    Outputf("(no tests actually performed for R5 version)\n");
#else	// TEST_R5


    // tests:
    // Internal TokenStream and CharStream classes

// Define some useful macros for dynamically allocating
// various Token classes
#define T(type) (new Token(type, -1))
#define S(str) (new StringToken(str, -1))
#define I(val) (new IntToken(val, -1))
#define F(val) (new FloatToken(val, -1))

    struct test_case {
        const char *rule;
        int tokenCount;
        Token *tokens[256];
    } testCases[] = {
        {   "'Hey'[]:", 4,
            {   S("Hey"),
                T(LeftBracket),
                T(RightBracket),
                T(Colon)
            }
        },
        { "1", 1, { I(1) } },
        { "1.0", 1, { F(1.0) } },

        { "1.0 (\"ABCD\")", 4, { F(1.0), T(LeftParen), S("ABCD"), T(RightParen) } },
        { "1.0 ('ABCD')", 4, { F(1.0), T(LeftParen), S("ABCD"), T(RightParen) } },
        { "  1.0 ('ABCD')  ", 4, { F(1.0), T(LeftParen), S("ABCD"), T(RightParen) } },
        {   "0.8 [0:3] ('ABCDEFG' | 'abcdefghij')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ABCDEFG"),
                T(Divider),
                S("abcdefghij"),
                T(RightParen)
            }
        },
        {   "0.5([10]'ABCD'|[17]'abcd'|[13]'EFGH')", 17,
            {   F(0.5),
                T(LeftParen),
                T(LeftBracket),
                I(10),
                T(RightBracket),
                S("ABCD"),
                T(Divider),
                T(LeftBracket),
                I(17),
                T(RightBracket),
                S("abcd"),
                T(Divider),
                T(LeftBracket),
                I(13),
                T(RightBracket),
                S("EFGH"),
                T(RightParen)
            }
        },
        {   "0.5  \n   [0:3]  \t ('ABCD' \n | 'abcd' | 'EFGH')", 13,
            {   F(0.5),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ABCD"),
                T(Divider),
                S("abcd"),
                T(Divider),
                S("EFGH"),
                T(RightParen)
            }
        },
        {   "0.8 [  0  :  3  ] ('ABCDEFG' | 'abcdefghij')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ABCDEFG"),
                T(Divider),
                S("abcdefghij"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] ('ABCDEFG' & 'abcdefg')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ABCDEFG"),
                T(Ampersand),
                S("abcdefg"),
                T(RightParen)
            }
        },
        {   "1.0 ('ABCD') | ('EFGH')", 8,
            {   F(1.0),
                T(LeftParen),
                S("ABCD"),
                T(RightParen),
                T(Divider),
                T(LeftParen),
                S("EFGH"),
                T(RightParen)
            }
        },
        {   "1.0 [0:3] ('ABCD') | [2:4] ('EFGH')", 18,
            {   F(1.0),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ABCD"),
                T(RightParen),
                T(Divider),
                T(LeftBracket),
                I(2),
                T(Colon),
                I(4),
                T(RightBracket),
                T(LeftParen),
                S("EFGH"),
                T(RightParen)
            }
        },
        {   "0.8 [0:4] (\\077Mkj0x34 & 'abcdefgh')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(4),
                T(RightBracket),
                T(LeftParen),
                S("\077Mkj0x34"),
                T(Ampersand),
                S("abcdefgh"),
                T(RightParen)
            }
        },
        {   "0.8 [0:4] (\\077Mkj\\x34 & 'abcdefgh')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(4),
                T(RightBracket),
                T(LeftParen),
                S("\077Mkj\x34"),
                T(Ampersand),
                S("abcdefgh"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\077034 & 'abcd')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\077034"),
                T(Ampersand),
                S("abcd"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\077\\034 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\077\034"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\77\\034 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\077\034"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\7 & 'a')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\007"),
                T(Ampersand),
                S("a"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"\\17\" & 'a')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\017"),
                T(Ampersand),
                S("a"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] ('\\17' & 'a')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\017"),
                T(Ampersand),
                S("a"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\g & 'a')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("g"),
                T(Ampersand),
                S("a"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\g&\\b)", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("g"),
                T(Ampersand),
                S("\b"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\g\\&b & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("g&b"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (0x3457 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\x34\x57"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\x34\\x57 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\x34\x57"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (0xA4b7 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\xA4\xb7"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\\xA4\\xb7 & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\xA4\xb7"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"\\xA4\\xb7\" & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\xA4\xb7"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\'\\xA4\\xb7\' & 'ab')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("\xA4\xb7"),
                T(Ampersand),
                S("ab"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] ('ab\"' & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ab\""),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"ab\\\"\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ab\""),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"ab\\A\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("abA"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"ab'\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ab'"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [0:3] (\"ab\\\\\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(0),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("ab\\"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [-5:-3] (\"abc\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(-5),
                T(Colon),
                I(-3),
                T(RightBracket),
                T(LeftParen),
                S("abc"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "0.8 [5:3] (\"abc\" & 'abc')", 11,
            {   F(0.8),
                T(LeftBracket),
                I(5),
                T(Colon),
                I(3),
                T(RightBracket),
                T(LeftParen),
                S("abc"),
                T(Ampersand),
                S("abc"),
                T(RightParen)
            }
        },
        {   "1.2 ('ABCD')", 4,
            {   F(1.2),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   ".2 ('ABCD')", 4,
            {   F(0.2),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "0. ('ABCD')", 4,
            {   F(0.0),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Signed integers
        {   "-1 ('ABCD')", 4,
            {   I(-1),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1 ('ABCD')", 4,
            {   I(1),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Unsigned extended floats
        {   "1E25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "1e25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "1E+25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "1e+25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "1E-25 ('ABCD')", 4,
            {   F(1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "1e-25 ('ABCD')", 4,
            {   F(1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Positive signed extended floats
        {   "+1E25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1e25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1E+25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1e+25 ('ABCD')", 4,
            {   F(1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1E-25 ('ABCD')", 4,
            {   F(1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1e-25 ('ABCD')", 4,
            {   F(1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Negative signed extended floats
        {   "-1E25 ('ABCD')", 4,
            {   F(-1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-1e25 ('ABCD')", 4,
            {   F(-1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-1E+25 ('ABCD')", 4,
            {   F(-1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-1e+25 ('ABCD')", 4,
            {   F(-1e25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-1E-25 ('ABCD')", 4,
            {   F(-1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-1e-25 ('ABCD')", 4,
            {   F(-1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Miscellaneous extended floats
        {   ".1E-25 ('ABCD')", 4,
            {   F(0.1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "-.1e-25 ('ABCD')", 4,
            {   F(-0.1e-25),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // Signed floats
        {   "-1.0 ('ABCD')", 4,
            {   F(-1.0),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        {   "+1.0 ('ABCD')", 4,
            {   F(1.0),
                T(LeftParen),
                S("ABCD"),
                T(RightParen)
            }
        },
        // The uber test
        {   "0 -0 +0 1 -2 +3 0. -0. +0. 1. -2. +3. 0.0 -0.1 +0.2 1.0 -2.1 +3.2 "
            "0.e0 0.e-1 0.e+2 1.e1 2.e-2 3.e+3 -1.e1 -2.e-2 -3.e+3 +1.e1 +2.e-2 +3.e+3 "
            "0.012345 1.23456 ( ) [ ] | & : -i "
            " \"abcxyzABCXYZ_ ( ) [ ] | & : -i \t\n \\\" ' \\012\\0\\377\\x00\\x12\\xab\\xCD\\xeF\\x1A\\xb2 \" "
            " 'abcxyzABCXYZ_ ( ) [ ] | & : -i \t\n \" \\' \\012\\0\\377\\x00\\x12\\xab\\xCD\\xeF\\x1A\\xb2 ' "
            " \\000abc_xyz123\"'\"'456 \\xA1a1 \\!\\?\\\\ "
            " 0x00 0x12 0xabCD 0xaBcD 0x0123456789aBcDeFfEdCbA", 50,
            {   I(0), I(0), I(0), I(1), I(-2), I(3), F(0.0), F(0.0), F(0.0),
                F(1.0), F(-2.0), F(3.0), F(0.0), F(-0.1), F(0.2), F(1.0), F(-2.1), F(3.2),
                F(0.0), F(0.0e-1), F(0.0e2), F(1.0e1), F(2.0e-2), F(3.0e3),
                F(-1.0e1), F(-2.0e-2), F(-3.0e3), F(1.0e1), F(2.0e-2), F(3.0e3),
                F(0.012345), F(1.23456), T(LeftParen), T(RightParen), T(LeftBracket),
                T(RightBracket), T(Divider), T(Ampersand), T(Colon), T(CaseInsensitiveFlag),
                S(std::string("abcxyzABCXYZ_ ( ) [ ] | & : -i \t\n \" ' \012\0\377\x00\x12\xab\xCD\xeF\x1A\xb2 ", 49)),
                S(std::string("abcxyzABCXYZ_ ( ) [ ] | & : -i \t\n \" ' \012\0\377\x00\x12\xab\xCD\xeF\x1A\xb2 ", 49)),
                S(std::string("\000abc_xyz123\"'\"'456", 18)),
                S("\241a1"),
                S("!?\\"),
                S(std::string("\x00", 1)), S("\x12"), S("\xAB\xCD"), S("\xAB\xCD"),
                S("\x01\x23\x45\x67\x89\xAB\xCD\xEF\xFE\xDC\xBA")
            }
        },
    };

// Undefine our nasty macros
#undef T
#undef S
#undef I
#undef F

    const int testCaseCount = sizeof(testCases) / sizeof(test_case);
    for (int i = 0; i < testCaseCount; i++) {
        NextSubTest();
//		cout << endl << testCases[i].rule << endl;
        TokenStream stream;
        try {
            stream.SetTo(testCases[i].rule);

            CHK(stream.InitCheck() == B_OK);
            for (int j = 0; j < testCases[i].tokenCount; j++) {
                const Token *token = stream.Get();
                CHK(token);
                /*
                				cout << tokenTypeToString(token->Type()) << endl;

                				if (token->Type() == CharacterString)
                					cout << " token1 == " << token->String() << endl;
                				if (testCases[i].tokens[j]->Type() == CharacterString)
                					cout << " token2 == " << (testCases[i].tokens[j])->String() << endl;

                				if (token->Type() == CharacterString)
                				{
                					const std::string &str = token->String();
                					printf("parser: ");
                					for (int i = 0; i < str.length(); i++)
                						printf("%x ", str[i]);
                					printf("\n");
                				}
                				if (testCases[i].tokens[j]->Type() == CharacterString)
                				{
                					const std::string &str = (testCases[i].tokens[j])->String();
                					printf("tester: ");
                					for (int i = 0; i < str.length(); i++)
                						printf("%x ", str[i]);
                					printf("\n");
                				}

                				switch (token->Type()) {
                					case CharacterString:
                						cout << " string == " << token->String() << endl;
                						break;
                					case Integer:
                						cout << " int == " << token->Int() << endl;
                						break;
                					case FloatingPoint:
                						cout << " float == " << token->Float() << endl;
                						break;
                				}
                */
                CHK(*token == *(testCases[i].tokens[j]));
                delete testCases[i].tokens[j];
            }
            CHK(stream.IsEmpty());
        } catch (Err *e) {
            CppUnit::Exception *err = new CppUnit::Exception(e->Msg());
            delete e;
            throw *err;
        }
    }

#endif	// !TEST_R5
}