public void TokenTypeName()
        {
            Tokenizer testSubject = new Tokenizer();

            Assert.AreEqual("None", testSubject.TokenTypeName);

            object[][] values = new object[][]
            {
            new object[] {"2147483649", "BigInt"},
            new object[] {Token.ValueFor.TRUE, "Boolean"},
            new object[] {"'2009-01-01'", "Date"},
            new object[] {"123.0123", "Decimal"},
            new object[] {"\"foo\"", "Delimited Identifier"},
            new object[] {"123.1e-23", "Float"},
            new object[] {"foo.bar", "Identifier Chain"},
            new object[] {int.MaxValue.ToString(), "Integer"},
            new object[] {"column_one", "Name"},
            new object[] {"@MyNamedParameter", "Named Parameter"},
            new object[] {"?", "Parameter Marker"},
            new object[] {"<", "Special"},
            new object[] {"'''foo'' they said.'","String"},
            new object[] {"'12:23:02'", "Time"},
            new object[] {"'2009-01-01 12:23:02.123456789'", "Timestamp"}
            };

            foreach (object[] row in values)
            {
                testSubject.Reset(row[0].ToString());

                testSubject.GetNextAsString();

                Assert.AreEqual((string)row[1], testSubject.TokenTypeName);
            }
        }
        public void TokenTypeTest()
        {
            Tokenizer testSubject = new Tokenizer();

            Assert.AreEqual(SqlTokenType.None, testSubject.TokenType);

            object[][] values = new object[][]
            {
            new object[] {"2147483649", SqlTokenType.BigIntLiteral},
            new object[] {Token.ValueFor.TRUE, SqlTokenType.BooleanLiteral},
            new object[] {"'2009-01-01'", SqlTokenType.DateLiteral},
            new object[] {"123.0123", SqlTokenType.DecimalLiteral},
            new object[] {"\"foo\"", SqlTokenType.DelimitedIdentifier},
            new object[] {"123.1e-23", SqlTokenType.FloatLiteral},
            new object[] {"foo.bar", SqlTokenType.IdentifierChain},
            new object[] {int.MaxValue.ToString(), SqlTokenType.IntegerLiteral},
            new object[] {"column_one", SqlTokenType.Name},
            new object[] {"@MyNamedParameter", SqlTokenType.NamedParameter},
            new object[] {"?", SqlTokenType.ParameterMarker},
            new object[] {"<", SqlTokenType.Special},
            new object[] {"'''foo'' they said.'", SqlTokenType.StringLiteral},
            new object[] {"'12:23:02'", SqlTokenType.TimeLiteral},
            new object[] {"'2009-01-01 12:23:02.123456789'", SqlTokenType.TimestampLiteral}
            };

            foreach (object[] row in values)
            {
                testSubject.Reset(row[0].ToString());

                testSubject.GetNextAsString();

                Assert.AreEqual((SqlTokenType)row[1], testSubject.TokenType);
            }
        }
        public void Position()
        {
            Tokenizer testSubject = new Tokenizer("the relative position is");

            Assert.AreEqual(0, testSubject.Position);

            testSubject.GetNextAsSimpleToken();
            testSubject.GetNextAsString();

            Assert.AreEqual("the relative".Length, testSubject.Position);
        }
        public void SetPartMarker()
        {
            Tokenizer testSubject = new Tokenizer("set part marker");

            testSubject.SetPartMarker();
            testSubject.GetNextAsString();
            testSubject.GetNextAsString();

            Assert.AreEqual("set part", testSubject.GetPart(testSubject.PartMarker, testSubject.Position));

            testSubject.SetPartMarker();
            testSubject.GetNextAsString();

            Assert.AreEqual(" marker", testSubject.GetPart(testSubject.PartMarker, testSubject.Position));
        }
        public void ParameterName()
        {
            Tokenizer testSubject = new Tokenizer("select @p_dummy from DUAL");

            testSubject.GetNextAsSimpleToken();
            testSubject.GetNextAsString();

            Assert.AreEqual("p_dummy", testSubject.ParameterName);
            Assert.AreEqual('@', testSubject.ParameterNamePrefix);
        }
        public void PartMarker()
        {
            Tokenizer testSubject = new Tokenizer("part of this");

            testSubject.SetPartMarker();
            int origin = testSubject.PartMarker;
            testSubject.GetNextAsString();
            testSubject.GetNextAsString();
            Assert.AreEqual("part of", testSubject.GetPart(origin, testSubject.Position));
        }
        public void LiteralValueDataType()
        {
            Tokenizer testSubject = new Tokenizer("1 1.0 1.0E2 '2009-01-01' '12:00:01' '2009-01-01 12:00:01' '2009-01-01 12:00:01.123456789'");

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.IntegerLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.Integer, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.DecimalLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.Decimal, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.FloatLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.Double, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.DateLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.Date, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.TimeLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.Time, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.TimestampLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.TimeStamp, testSubject.LiteralValueDataType);

            testSubject.GetNextAsString();

            Assert.AreEqual(SqlTokenType.TimestampLiteral, testSubject.TokenType);
            Assert.AreEqual(HsqlProviderType.TimeStamp, testSubject.LiteralValueDataType);
        }
        public void NormalizedToken()
        {
            Tokenizer testSubject = new Tokenizer("select 'Let''s Have a nice day!' from DUAL");

            testSubject.GetNextAsString();

            Assert.AreEqual("SELECT", testSubject.NormalizedToken);

            testSubject.GetNextAsString();

            Assert.AreEqual("'Let''s Have a nice day!'", testSubject.NormalizedToken);
        }
        public void IsGetThis()
        {
            Tokenizer testSubject = new Tokenizer("create table test(id int, \"val\" varchar(12));");

            if (testSubject.IsGetThis(Token.ValueFor.ALTER))
            {
                Assert.AreEqual(Token.ValueFor.CREATE, Token.ValueFor.ALTER);
            }
            else if (testSubject.IsGetThis(Token.ValueFor.CREATE))
            {
                if (testSubject.IsGetThis(Token.ValueFor.VIEW))
                {
                    Assert.AreEqual(Token.ValueFor.TABLE, Token.ValueFor.VIEW);
                }
                else if (testSubject.IsGetThis(Token.ValueFor.TABLE))
                {
                    string table_name = testSubject.GetNextAsName();
                }
                else
                {
                    Assert.AreNotEqual(Token.ValueFor.TABLE, testSubject.GetNextAsString());
                }
            }
            else if (testSubject.IsGetThis(Token.ValueFor.DROP))
            {
                Assert.AreEqual(Token.ValueFor.CREATE, Token.ValueFor.DROP);
            }
            else
            {
                Assert.AreNotEqual(Token.ValueFor.CREATE, testSubject.GetNextAsString());
            }
        }
        public void LastPart()
        {
            Tokenizer testSubject = new Tokenizer("create table test(id int, \"val\" varchar(12));");

            Assert.AreEqual(Token.ValueFor.CREATE, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(6, testSubject.Position);
            Assert.AreEqual("create", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.TABLE, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(12, testSubject.Position);
            Assert.AreEqual("create table", testSubject.LastPart);

            testSubject.PartMarker = testSubject.Position + 1;

            Assert.AreEqual("TEST", testSubject.GetNextAsSimpleName());
            Assert.AreEqual(17, testSubject.Position);
            Assert.AreEqual("test", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.OPENBRACKET, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(18, testSubject.Position);
            Assert.AreEqual("test(", testSubject.LastPart);

            Assert.AreEqual("ID", testSubject.GetNextAsSimpleName());
            Assert.AreEqual(20, testSubject.Position);
            Assert.AreEqual("test(id", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.INT, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(24, testSubject.Position);
            Assert.AreEqual("test(id int", testSubject.LastPart);

            testSubject.SetPartMarker();

            Assert.AreEqual(Token.ValueFor.COMMA, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(25, testSubject.Position);
            Assert.AreEqual(Token.ValueFor.COMMA, testSubject.LastPart);

            Assert.AreEqual("val", testSubject.GetNextAsName());
            Assert.AreEqual(SqlTokenType.DelimitedIdentifier, testSubject.TokenType);
            Assert.AreEqual(31,testSubject.Position);
            Assert.AreEqual(", \"val\"", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.VARCHAR, testSubject.GetNextAsSimpleToken());
            Assert.AreEqual(39, testSubject.Position);
            Assert.AreEqual(", \"val\" varchar", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.OPENBRACKET, testSubject.GetThis(Token.ValueFor.OPENBRACKET));
            Assert.AreEqual(40, testSubject.Position);
            Assert.AreEqual(", \"val\" varchar(", testSubject.LastPart);

            Assert.AreEqual(12, testSubject.GetNextAsInt());
            Assert.AreEqual(42, testSubject.Position);
            Assert.AreEqual(", \"val\" varchar(12", testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.CLOSEBRACKET, testSubject.GetThis(Token.ValueFor.CLOSEBRACKET));
            Assert.AreEqual(43, testSubject.Position);
            Assert.AreEqual(", \"val\" varchar(12)", testSubject.LastPart);

            testSubject.SetPartMarker();

            Assert.AreEqual(Token.ValueFor.CLOSEBRACKET, testSubject.GetThis(Token.ValueFor.CLOSEBRACKET));
            Assert.AreEqual(44, testSubject.Position);
            Assert.AreEqual(Token.ValueFor.CLOSEBRACKET, testSubject.LastPart);

            Assert.AreEqual(Token.ValueFor.SEMICOLON, testSubject.GetThis(Token.ValueFor.SEMICOLON));
            Assert.AreEqual(45, testSubject.Position);
            Assert.AreEqual(");", testSubject.LastPart);

            Assert.AreEqual(string.Empty, testSubject.GetNextAsString());

            Assert.AreEqual(45, testSubject.Position);
            Assert.AreEqual(");", testSubject.LastPart);

            testSubject.SetPartMarker();

            Assert.AreEqual(string.Empty, testSubject.LastPart);
        }
        public void IdentiferChainPredecessor()
        {
            Tokenizer testSubject = new Tokenizer("foo.bar.baz");

            string token = testSubject.GetNextAsString();

            Assert.AreEqual("BAR", testSubject.IdentifierChainPredecessor);

            testSubject.Reset("bing.foo.\"bar\".baz");

            token = testSubject.GetNextAsString();

            Assert.AreEqual("bar", testSubject.IdentifierChainPredecessor);
        }
        public void GetPart()
        {
            Tokenizer testSubject = new Tokenizer("FOO.BAR AS BAR.FOO");

            string actual = testSubject.GetPart(0, "FOO.BAR AS BAR.FOO".Length);

            Assert.AreEqual("FOO.BAR AS BAR.FOO", actual);

            testSubject.SetPartMarker();

            Assert.AreEqual(0, testSubject.PartMarker);
            Assert.AreEqual(0, testSubject.Position);

            actual = testSubject.GetNextAsString();

            Assert.AreEqual("BAR", actual);
            Assert.AreEqual(SqlTokenType.IdentifierChain, testSubject.TokenType);
            Assert.That(!testSubject.WasIdentifierChainPredecessorDelimited);
            Assert.AreEqual("FOO", testSubject.IdentifierChainPredecessor);

            Assert.AreEqual("FOO.BAR ".IndexOf(' '), testSubject.Position);

            actual = testSubject.GetPart(testSubject.PartMarker, testSubject.Position);

            Assert.AreEqual("FOO.BAR", actual);

            testSubject.SetPartMarker();

            actual = testSubject.GetNextAsString();

            Assert.AreEqual(Token.ValueFor.AS, actual);
            Assert.AreEqual("FOO.BAR_AS ".IndexOf(' '), testSubject.Position);

            actual = testSubject.GetPart(testSubject.PartMarker, testSubject.Position);

            Assert.AreEqual(" AS", actual);
        }
        public void GetNextAsString()
        {
            Tokenizer testSubject = new Tokenizer("FOO.BAR");

            string actual = testSubject.GetNextAsString();

            Assert.AreEqual("BAR", actual);
            Assert.AreEqual(true, testSubject.WasIdentifierChain);
            Assert.AreEqual("FOO", testSubject.IdentifierChainPredecessor);
        }
        public void WasThis()
        {
            Tokenizer testSubject = new Tokenizer("foo bar \"baz\" foo.bar");

            testSubject.GetThis("FOO");
            testSubject.GetThis("BAR");

            Assert.AreEqual(true, testSubject.WasThis("BAR"));
            Assert.AreEqual(false, testSubject.WasThis("bar"));
            Assert.AreEqual(false, testSubject.WasThis(" BAR "));
            Assert.AreEqual(false, testSubject.WasThis("NOTBAR"));

            string name = testSubject.GetNextAsName();

            // not for use with delimited identifier.

            Assert.AreEqual(false, testSubject.WasThis("baz"));
            Assert.AreEqual(false, testSubject.WasThis("BAZ"));
            Assert.AreEqual(false, testSubject.WasThis(" baz "));
            Assert.AreEqual(false, testSubject.WasThis("notbaz"));

            string s = testSubject.GetNextAsString();

            // not for use with identifier chain.

            Assert.AreEqual(false, testSubject.WasThis("bar"));
            Assert.AreEqual(false, testSubject.WasThis("BAR"));
            Assert.AreEqual(false, testSubject.WasThis(" bar "));
            Assert.AreEqual(false, testSubject.WasThis("notbar"));
        }
        public void WasNamedParameter()
        {
            Tokenizer testSubject = new Tokenizer("update test set id = @IdParam, val = :ValParam");

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis(Token.ValueFor.UPDATE);

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis("TEST");

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis(Token.ValueFor.SET);

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis("ID");

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis(Token.ValueFor.EQUALS);

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetNextAsString();

            Assert.AreEqual(true, testSubject.WasNamedParameter);
            Assert.AreEqual("IdParam", testSubject.ParameterName);
            Assert.AreEqual('@', testSubject.ParameterNamePrefix);

            testSubject.GetThis(Token.ValueFor.COMMA);

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis("VAL");

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetThis(Token.ValueFor.EQUALS);

            Assert.AreEqual(false, testSubject.WasNamedParameter);
            Assert.AreEqual(string.Empty, testSubject.ParameterName);
            Assert.AreEqual(' ', testSubject.ParameterNamePrefix);

            testSubject.GetNextAsString();

            Assert.AreEqual(true, testSubject.WasNamedParameter);
            Assert.AreEqual("ValParam", testSubject.ParameterName);
            Assert.AreEqual(':', testSubject.ParameterNamePrefix);
        }