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

            Assert.AreEqual(false, testSubject.EnforceTwoPartIdentifierChain);

            testSubject.EnforceTwoPartIdentifierChain = true;

            Assert.AreEqual(true, testSubject.EnforceTwoPartIdentifierChain);

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

            try
            {
                testSubject.GetNextAsName();
            }
            catch (HsqlDataSourceException hdse)
            {
                Assert.AreEqual(org.hsqldb.Trace.THREE_PART_IDENTIFIER, -hdse.ErrorCode);
            }

            testSubject.EnforceTwoPartIdentifierChain = false;

            testSubject.Reset("foo.\"bar\".baz.null.true.false");

            testSubject.GetNextAsName();

            Token[] expected = new Token[]
            {
                new Token("FOO",SqlTokenType.Name),
                new Token("bar",SqlTokenType.DelimitedIdentifier),
                new Token("BAZ",SqlTokenType.Name),
                new Token("NULL",SqlTokenType.Name),
                new Token("TRUE",SqlTokenType.Name),
                new Token("FALSE",SqlTokenType.Name),
            };

            int i = 0;

            foreach (Token token in testSubject.IdentifierChain)
            {
                Console.WriteLine(token);
                Console.WriteLine(expected[i]);
                Assert.AreEqual(expected[i], token);

                i++;
            }
        }
        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 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 IdentiferChainLengthExceeded()
        {
            try
            {
                throw Tokenizer.IdentiferChainLengthExceeded();
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(typeof(HsqlDataSourceException), ex);
                Assert.AreEqual(org.hsqldb.Trace.THREE_PART_IDENTIFIER, -((HsqlDataSourceException)ex).ErrorCode);
            }

            Tokenizer testSubject = new Tokenizer("foo.bar.baz");

            testSubject.EnforceTwoPartIdentifierChain = true;

            try
            {
                string name = testSubject.GetNextAsName();

                Assert.Fail("successful invocation of ReadToken() with greater than 2-part identifier token");
            }
            catch (AssertionException)
            {
                throw;
            }
            catch (Exception ex)
            {
                Assert.IsInstanceOfType(typeof(HsqlDataSourceException), ex);
                Assert.AreEqual(org.hsqldb.Trace.THREE_PART_IDENTIFIER, -((HsqlDataSourceException)ex).ErrorCode);
            }
        }
        public void IdentiferChain()
        {
            object[] input = new object[]
            {
                new object []
                {
                    "foo.bar.baz",
                    new Token[]{
                        new Token("FOO",SqlTokenType.Name),
                        new Token("BAR",SqlTokenType.Name),
                        new Token("BAZ",SqlTokenType.Name)
                    }
                },
                new object []
                {
                    "\"foo\".bar.\"baz\"",
                    new Token[]{
                        new Token("foo",SqlTokenType.DelimitedIdentifier),
                        new Token("BAR",SqlTokenType.Name),
                        new Token("baz",SqlTokenType.DelimitedIdentifier)
                    }
                },
                new object []
                {
                    "\"foo.bar\".baz",
                    new Token[]{
                        new Token("foo.bar",SqlTokenType.DelimitedIdentifier),
                        new Token("BAZ",SqlTokenType.Name)
                    }
                }
            };

            foreach (object[] item in input)
            {
                string toTokenize = item[0] as string;
                Token[] expectedTokens = item[1] as Token[];

                Tokenizer testSubject = new Tokenizer(toTokenize);

                string result = testSubject.GetNextAsName();
                Token[] actualTokens = new List<Token>(testSubject.IdentifierChain).ToArray();

                Assert.AreEqual(expectedTokens.Length, actualTokens.Length);

                for (int i = 0; i < expectedTokens.Length; i++)
                {
                    Token expectedToken = expectedTokens[i];
                    Token actualToken = actualTokens[i];

                    Assert.AreEqual(expectedToken, actualToken);
                }

            }
        }
        public void GetNextAsName()
        {
            Tokenizer testSubject = new Tokenizer("CREATE TABLE \"PUBLIC\".\"Foo \"\"BarBaz\"\"\"");

            testSubject.GetThis("CREATE");
            testSubject.GetThis("TABLE");

            string expectedSubjectPart = "Foo \"BarBaz\"";
            string expectedQualifierPart = "PUBLIC";
            string actualSubjectPart = testSubject.GetNextAsName();
            string actualQualifierPart = testSubject.IdentifierChainPredecessor;

            Assert.AreEqual(expectedQualifierPart, actualQualifierPart, "schema qualifier" );
            Assert.AreEqual(expectedSubjectPart, actualSubjectPart, "object name");
        }
        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 WasIdentifierChainPredecessorDelimited()
        {
            Tokenizer testSubject = new Tokenizer("foo foo.bar \"foo\".bar");

            testSubject.GetNextAsName();

            Assert.AreEqual(false, testSubject.WasIdentifierChain);
            Assert.AreEqual(false, testSubject.WasIdentifierChainPredecessorDelimited);

            testSubject.GetNextAsName();

            Assert.AreEqual(true, testSubject.WasIdentifierChain);
            Assert.AreEqual(false, testSubject.WasIdentifierChainPredecessorDelimited);

            testSubject.GetNextAsName();

            Assert.AreEqual(true, testSubject.WasIdentifierChain);
            Assert.AreEqual(true, testSubject.WasIdentifierChainPredecessorDelimited);
        }
        public void WasIdentifierChain()
        {
            Tokenizer testSubject = new Tokenizer("foo foo.bar \"foo\".bar foo.\"bar\" \"foo\".\"bar\" \"foo\".\"bar\"");

            testSubject.GetNextAsName();

            Assert.AreEqual(false, testSubject.WasIdentifierChain);

            string tokenValue;

            while (string.Empty != (tokenValue = testSubject.GetNextAsName()))
            {
                Assert.AreEqual(true, testSubject.WasIdentifierChain);
            }
        }
        public void WasDelimitedIdentifier()
        {
            Tokenizer testSubject = new Tokenizer("+ join foo \"foo\" bar.\"foo\"");

            testSubject.GetThis(Token.ValueFor.PLUS);

            Assert.AreEqual(false, testSubject.WasDelimitedIdentifier);

            Assert.AreEqual(Token.ValueFor.JOIN, testSubject.GetNextAsSimpleToken());

            Assert.AreEqual(false, testSubject.WasDelimitedIdentifier);

            Assert.AreEqual("FOO", testSubject.GetNextAsName());

            Assert.AreEqual(false, testSubject.WasDelimitedIdentifier);

            Assert.AreEqual("foo", testSubject.GetNextAsName());

            Assert.AreEqual(true, testSubject.WasDelimitedIdentifier);
            Assert.AreEqual(false, testSubject.WasIdentifierChain);
            Assert.AreEqual(null, testSubject.IdentifierChainPredecessor);

            Assert.AreEqual("foo", testSubject.GetNextAsName());

            Assert.AreEqual(true, testSubject.WasDelimitedIdentifier);
            Assert.AreEqual(true, testSubject.WasIdentifierChain);
            Assert.AreEqual(false, testSubject.WasIdentifierChainPredecessorDelimited);
            Assert.AreEqual("BAR", testSubject.IdentifierChainPredecessor);
        }