blob: eb3358d75328485a7af765c8806275a6fcc1a90f [file] [log] [blame]
// Copyright (C) 2019 The Android Open Source Project
//
// 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 com.google.gerrit.index.query;
import static com.google.common.truth.Truth.assertThat;
import com.google.common.truth.ThrowableSubject;
import java.util.Collection;
import java.util.Objects;
import org.junit.Test;
public class QueryBuilderTest {
private static class TestPredicate extends Predicate<Object> {
private final String field;
private final String value;
TestPredicate(String field, String value) {
this.field = field;
this.value = value;
}
@Override
public Predicate<Object> copy(Collection<? extends Predicate<Object>> children) {
throw new UnsupportedOperationException();
}
@Override
public int hashCode() {
return Objects.hash(field, value);
}
@Override
public boolean equals(Object o) {
if (!(o instanceof TestPredicate)) {
return false;
}
TestPredicate p = (TestPredicate) o;
return Objects.equals(field, p.field) && Objects.equals(value, p.value);
}
}
private static class TestQueryBuilder extends QueryBuilder<Object, TestQueryBuilder> {
TestQueryBuilder() {
super(new QueryBuilder.Definition<>(TestQueryBuilder.class), null);
}
@Operator
@SuppressWarnings("unused")
public Predicate<Object> a(String value) {
return new TestPredicate("a", value);
}
}
@Test
public void fieldNameAndValue() throws Exception {
assertThat(parse("a:foo")).isEqualTo(new TestPredicate("a", "foo"));
}
@Test
public void fieldWithParenthesizedValues() throws Exception {
assertThatParseException("a:(foo bar)").hasMessageThat().contains("no viable alternative");
}
@Test
public void fieldNameAndValueThatLooksLikeFieldNameColonValue() throws Exception {
assertThat(parse("a:foo:bar")).isEqualTo(new TestPredicate("a", "foo:bar"));
}
@Test
public void fieldNameAndValueThatLooksLikeWordColonValue() throws Exception {
assertThat(parse("a:*:bar")).isEqualTo(new TestPredicate("a", "*:bar"));
}
@Test
public void fieldNameAndValueWithMultipleColons() throws Exception {
assertThat(parse("a:*:*:*")).isEqualTo(new TestPredicate("a", "*:*:*"));
}
@Test
public void exactPhraseWithQuotes() throws Exception {
assertThat(parse("a:\"foo bar\"")).isEqualTo(new TestPredicate("a", "foo bar"));
}
@Test
public void exactPhraseWithQuotesAndColon() throws Exception {
assertThat(parse("a:\"foo:bar\"")).isEqualTo(new TestPredicate("a", "foo:bar"));
}
@Test
public void exactPhraseWithBraces() throws Exception {
assertThat(parse("a:{foo bar}")).isEqualTo(new TestPredicate("a", "foo bar"));
}
@Test
public void exactPhraseWithBracesAndColon() throws Exception {
assertThat(parse("a:{foo:bar}")).isEqualTo(new TestPredicate("a", "foo:bar"));
}
private static Predicate<Object> parse(String query) throws Exception {
return new TestQueryBuilder().parse(query);
}
private static ThrowableSubject assertThatParseException(String query) {
try {
new TestQueryBuilder().parse(query);
throw new AssertionError("expected QueryParseException for " + query);
} catch (QueryParseException e) {
return assertThat(e);
}
}
}