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

            testObject.Start("blah");

            Assert.False(testObject.AtEnd);
        }
        public void tokenizer_recognizes_semi_colon()
        {
            var testObject = new QueryTokenizer();

            testObject.Start(";");

            Assert.True(testObject.Token == QueryTokens.SemiColon);
            Assert.True(testObject.TokenString == ";");
        }
        public void failed_expectation_throws_exception()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("blah");

            Assert.Throws <ApplicationException>(() => testObject.Expect(QueryTokens.UniqueID));

            Assert.True(testObject.AtEnd);
        }
        public void succeeded_expectation_advances()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("blah#foo");

            testObject.Expect(QueryTokens.Name);

            Assert.Equal(QueryTokens.UniqueID, testObject.Token);
        }
        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 tokenizer_recognizes_unique_id()
        {
            var testObject = new QueryTokenizer();

            var name = "blah";

            testObject.Start("#" + name);

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

            var name = "blah";

            testObject.Start(name);

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

            var name = "blah";

            testObject.Start("  " + name);

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

            var str = "hello there";

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

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

            var str = string.Empty;

            testObject.Start("'" + str + "'");

            Assert.True(testObject.Token == QueryTokens.QuotedString);
            Assert.True(testObject.TokenString == str);
        }
        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 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 advancing_with_a_single_token_ends_tokenizer()
        {
            var testObject = new QueryTokenizer();

            testObject.Start("blah");

            testObject.Advance();

            Assert.True(testObject.AtEnd);
            Assert.Equal(QueryTokens.End, testObject.Token);
            Assert.Equal(string.Empty, testObject.TokenString);
        }
        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_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_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_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_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_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_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);
        }
        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_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 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 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 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 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);
        }