// Copyright 2016 Google Inc. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

/*package query

import (
	"log"
	"reflect"
	"regexp/syntax"
	"testing"
)

func mustParseRE(s string) *syntax.Regexp {
	r, err := syntax.Parse(s, syntax.ClassNL|syntax.PerlX|syntax.UnicodeGroups)
	if err != nil {
		log.Panicf("parsing %q: %v", s, err)
	}
	return r
}

func TestParseQuery(t *testing.T) {
	type testcase struct {
		in   string
		want Q
	}

	for _, c := range []testcase{
		{`\bword\b`, &Regexp{Regexp: mustParseRE(`\bword\b`)}},
		{"fi\"le:bla\"", &Substring{Pattern: "file:bla"}},
		{"abc or def", NewOr(&Substring{Pattern: "abc"}, &Substring{Pattern: "def"})},
		{"(abc or def)", NewOr(&Substring{Pattern: "abc"}, &Substring{Pattern: "def"})},
		{"(ppp qqq or rrr sss)", NewOr(
			NewAnd(&Substring{Pattern: "ppp"}, &Substring{Pattern: "qqq"}),
			NewAnd(&Substring{Pattern: "rrr"}, &Substring{Pattern: "sss"}))},
		{"((x) ora b(z(d)))", NewAnd(
			&Regexp{Regexp: mustParseRE("(x)")},
			&Substring{Pattern: "ora"},
			&Regexp{Regexp: mustParseRE("b(z(d))")})},
		{"( )", &Const{Value: true}},
		{"(abc)(de)", &Regexp{Regexp: mustParseRE("(abc)(de)")}},
		{"sub-pixel", &Substring{Pattern: "sub-pixel"}},
		{"abc", &Substring{Pattern: "abc"}},
		{"ABC", &Substring{Pattern: "ABC", CaseSensitive: true}},
		{"\"abc bcd\"", &Substring{Pattern: "abc bcd"}},
		{"abc bcd", NewAnd(
			&Substring{Pattern: "abc"},
			&Substring{Pattern: "bcd"})},
		{"f:fs", &Substring{Pattern: "fs", FileName: true}},
		{"fs", &Substring{Pattern: "fs"}},
		{"-abc", &Not{&Substring{Pattern: "abc"}}},
		{"abccase:yes", &Substring{Pattern: "abccase:yes"}},
		{"file:abc", &Substring{Pattern: "abc", FileName: true}},
		{"branch:pqr", &Branch{Pattern: "pqr"}},
		{"((x) )", &Regexp{Regexp: mustParseRE("(x)")}},
		{"file:helpers\\.go byte", NewAnd(
			&Substring{Pattern: "helpers.go", FileName: true},
			&Substring{Pattern: "byte"})},
		{"(abc def)", NewAnd(
			&Substring{Pattern: "abc"},
			&Substring{Pattern: "def"})},
		{"(abc def", nil},
		{"regex:abc[p-q]", &Regexp{Regexp: mustParseRE("abc[p-q]")}},
		{"aBc[p-q]", &Regexp{Regexp: mustParseRE("aBc[p-q]"), CaseSensitive: true}},
		{"aBc[p-q] case:auto", &Regexp{Regexp: mustParseRE("aBc[p-q]"), CaseSensitive: true}},
		{"repo:go", &Repo{"go"}},

		{"file:\"\"", &Const{true}},
		{"abc.*def", &Regexp{Regexp: mustParseRE("abc.*def")}},
		{"abc\\.\\*def", &Substring{Pattern: "abc.*def"}},
		{"(abc)", &Regexp{Regexp: mustParseRE("(abc)")}},

		{"c:abc", &Substring{Pattern: "abc", Content: true}},
		{"content:abc", &Substring{Pattern: "abc", Content: true}},

		{"lang:c++", &Language{"c++"}},
		{"sym:pqr", &Symbol{&Substring{Pattern: "pqr"}}},
		{"sym:Pqr", &Symbol{&Substring{Pattern: "Pqr", CaseSensitive: true}}},

		// case
		{"abc case:yes", &Substring{Pattern: "abc", CaseSensitive: true}},
		{"abc case:auto", &Substring{Pattern: "abc", CaseSensitive: false}},
		{"ABC case:auto", &Substring{Pattern: "ABC", CaseSensitive: true}},
		{"ABC case:\"auto\"", &Substring{Pattern: "ABC", CaseSensitive: true}},
		{"abc -f:def case:yes", NewAnd(
			&Substring{Pattern: "abc", CaseSensitive: true},
			&Not{Child: &Substring{Pattern: "def", FileName: true, CaseSensitive: true}},
		)},

		// errors.
		{"--", nil},
		{"\"abc", nil},
		{"\"a\\", nil},
		{"case:foo", nil},

		{"sym:", nil},
		{"abc or", nil},
		{"or abc", nil},
		{"def or or abc", nil},

		{"", &Const{Value: true}},
	} {
		got, err := Parse(c.in)
		if (c.want == nil) != (err != nil) {
			t.Errorf("Parse(%q): error %v, want %v", c.in, err, c.want)
		} else if got != nil {
			if !reflect.DeepEqual(got, c.want) {
				t.Errorf("Parse(%s): got %v want %v", c.in, got, c.want)
			}
		}
	}
}

func TestTokenize(t *testing.T) {
	type testcase struct {
		in   string
		typ  int
		text string
	}

	cases := []testcase{
		{"file:bla", tokFile, "bla"},
		{"file:bla ", tokFile, "bla"},
		{"f:bla ", tokFile, "bla"},
		{"(abc def) ", tokParenOpen, "("},
		{"(abcdef)", tokText, "(abcdef)"},
		{"(abc)(de)", tokText, "(abc)(de)"},
		{"(ab(c)def) ", tokText, "(ab(c)def)"},
		{"(ab\\ def) ", tokText, "(ab\\ def)"},
		{") ", tokParenClose, ")"},
		{"a(bc))", tokText, "a(bc)"},
		{"abc) ", tokText, "abc"},
		{"file:\"bla\"", tokFile, "bla"},
		{"\"file:bla\"", tokText, "file:bla"},
		{"\\", tokError, ""},
		{"o\"r\" bla", tokText, "or"},
		{"or bla", tokOr, "or"},
		{"ar bla", tokText, "ar"},
	}
	for _, c := range cases {
		tok, err := nextToken([]byte(c.in))
		if err != nil {
			tok = &token{Type: tokError}
		}
		if tok.Type != c.typ {
			t.Errorf("%s: got type %d, want %d", c.in, tok.Type, c.typ)
			continue
		}

		if string(tok.Text) != c.text {
			t.Errorf("%s: got text %q, want %q", c.in, tok.Text, c.text)
		}
	}
}*/
