public void advancing_too_far_with_1_token_throws_exception()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("blah");

            testObject.Advance();

            Assert.Throws <ApplicationException>(() => testObject.Advance());
        }
        public void advancing_to_unterminated_quoted_string_throws_alt()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("name 'whatever");

            Assert.Throws <ApplicationException>(() =>
            {
                testObject.Advance(); // Go past name
                testObject.Advance(); // Go poast whitespace.
            });
        }
        public void advanced_to_end_with_two_tokens()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("blah blah");

            testObject.Advance();
            testObject.Advance();

            Assert.True(testObject.AtEnd);
            Assert.Equal(QueryTokens.End, testObject.Token);
            Assert.Equal(string.Empty, testObject.TokenString);
        }
        public void advancing_to_broken_unique_id_causes_exception()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("name #");

            Assert.Throws <ApplicationException>(() => testObject.Advance());

            Assert.Equal(QueryTokens.End, testObject.Token);
            Assert.Equal(string.Empty, testObject.TokenString);
            Assert.True(testObject.AtEnd);
        }
        public void slash_can_separate_names()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start(name1 + "/" + name2);

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Slash);
            Assert.True(testObject.TokenString == "/");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);
        }
        public void semi_colon_can_separate_names()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start(name1 + ";" + name2);

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.SemiColon);
            Assert.True(testObject.TokenString == ";");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);
        }
        public void exclamation_mark_can_separate_names()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start(name1 + "!" + name2);

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.ExclamationMark);
            Assert.True(testObject.TokenString == "!");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);
        }
        public void tokenizer_recognizes_three_names()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";
            var name3 = "name3";

            testObject.Start(name1 + " " + name2 + " " + name3);

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name3);
        }
        public void tokenizer_recognizes_slash()
        {
            var testObject = new QueryTokenizer();

            var name = "name";

            testObject.Start("/" + name);

            Assert.True(testObject.Token == QueryTokens.Slash);
            Assert.True(testObject.TokenString == "/");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);
        }
        public void tokenizer_recognizes_colon_and_name_separated_by_whitespace()
        {
            var testObject = new QueryTokenizer();

            var name = "name";

            testObject.Start(":   " + name);

            Assert.True(testObject.Token == QueryTokens.Colon);
            Assert.True(testObject.TokenString == ":");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);
        }
        public void tokenizer_recognizes_greater_than()
        {
            var testObject = new QueryTokenizer();

            var name = "name";

            testObject.Start(">" + name);

            Assert.True(testObject.Token == QueryTokens.GreaterThan);
            Assert.True(testObject.TokenString == ">");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);
        }
        public void tokenizer_recognizes_question_mark_and_name_with_separator()
        {
            var testObject = new QueryTokenizer();

            var name = "name";

            testObject.Start("?   " + name);

            Assert.True(testObject.Token == QueryTokens.QuestionMark);
            Assert.True(testObject.TokenString == "?");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);
        }
        public void tokenizer_recognizes_exclamation_mark_and_name_with_whitespace_in_between()
        {
            var testObject = new QueryTokenizer();

            var name = "name";

            testObject.Start("!   " + name);

            Assert.True(testObject.Token == QueryTokens.ExclamationMark);
            Assert.True(testObject.TokenString == "!");

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);
        }
        public void tokenizer_recognizes_unique_id_then_name()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start("#" + name1 + " " + name2);

            Assert.True(testObject.Token == QueryTokens.UniqueID);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);
        }
        public void tokenizer_recognizes_two_unique_ids_with_no_space_between()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start("#" + name1 + "#" + name2);

            Assert.True(testObject.Token == QueryTokens.UniqueID);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.UniqueID);
            Assert.True(testObject.TokenString == name2);
        }
        public void tokenizer_quoted_string_ends_name_token()
        {
            var testObject = new QueryTokenizer();

            var name = "foo";
            var str  = "hello there";

            testObject.Start(name + "\"" + str + "\"");

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.QuotedString);
            Assert.True(testObject.TokenString == str);
        }
        public void tokenizer_recognizes_two_names_separated_by_whitespace()
        {
            var testObject = new QueryTokenizer();

            var name1 = "name1";
            var name2 = "name2";

            testObject.Start(name1 + " " + name2);

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name1);

            testObject.Advance();

            Assert.True(testObject.Token == QueryTokens.Name);
            Assert.True(testObject.TokenString == name2);
        }