blob: 6c51be1d4302c80352f4ff4de1b90a362e95a956 [file] [log] [blame]
/*
* Copyright 2021 Google LLC
*
* 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.auto.value.extension.toprettystring;
import static com.google.testing.compile.CompilationSubject.assertThat;
import static com.google.testing.compile.Compiler.javac;
import com.google.auto.value.extension.toprettystring.processor.ToPrettyStringValidator;
import com.google.testing.compile.Compilation;
import com.google.testing.compile.JavaFileObjects;
import javax.tools.JavaFileObject;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class ToPrettyStringValidatorTest {
@Test
public void cannotBeStatic() {
JavaFileObject file =
JavaFileObjects.forSourceLines(
"test.Test",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Test {",
" @ToPrettyString",
" static String toPretty() {",
" return new String();",
" }",
"}",
"");
Compilation compilation = compile(file);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining("must be instance methods")
.inFile(file)
.onLineContaining("static String toPretty()");
}
@Test
public void mustReturnString() {
JavaFileObject file =
JavaFileObjects.forSourceLines(
"test.Test",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Test {",
" @ToPrettyString",
" CharSequence toPretty() {",
" return new String();",
" }",
"}",
"");
Compilation compilation = compile(file);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining("must return String")
.inFile(file)
.onLineContaining("CharSequence toPretty()");
}
@Test
public void noParameters() {
JavaFileObject file =
JavaFileObjects.forSourceLines(
"test.Test",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Test {",
" @ToPrettyString",
" String toPretty(String value) {",
" return value;",
" }",
"}",
"");
Compilation compilation = compile(file);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining("cannot have parameters")
.inFile(file)
.onLineContaining("String toPretty(String value)");
}
@Test
public void onlyOneToPrettyStringMethod_sameClass() {
JavaFileObject file =
JavaFileObjects.forSourceLines(
"test.Test",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Test {",
" @ToPrettyString",
" String toPretty1() {",
" return new String();",
" }",
"",
" @ToPrettyString",
" String toPretty2() {",
" return new String();",
" }",
"}",
"");
Compilation compilation = compile(file);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining(
error(
"test.Test has multiple @ToPrettyString methods:",
" - test.Test.toPretty1()",
" - test.Test.toPretty2()"))
.inFile(file)
.onLineContaining("class Test");
}
@Test
public void onlyOneToPrettyStringMethod_superclass() {
JavaFileObject superclass =
JavaFileObjects.forSourceLines(
"test.Superclass",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Superclass {",
" @ToPrettyString",
" String toPretty1() {",
" return new String();",
" }",
"}",
"");
JavaFileObject subclass =
JavaFileObjects.forSourceLines(
"test.Subclass",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Subclass extends Superclass {",
" @ToPrettyString",
" String toPretty2() {",
" return new String();",
" }",
"}",
"");
Compilation compilation = compile(superclass, subclass);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining(
error(
"test.Subclass has multiple @ToPrettyString methods:",
" - test.Superclass.toPretty1()",
" - test.Subclass.toPretty2()"))
.inFile(subclass)
.onLineContaining("class Subclass");
}
@Test
public void onlyOneToPrettyStringMethod_superinterface() {
JavaFileObject superinterface =
JavaFileObjects.forSourceLines(
"test.Superinterface",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"interface Superinterface {",
" @ToPrettyString",
" default String toPretty1() {",
" return new String();",
" }",
"}",
"");
JavaFileObject subclass =
JavaFileObjects.forSourceLines(
"test.Subclass",
"package test;",
"",
"import com.google.auto.value.extension.toprettystring.ToPrettyString;",
"",
"class Subclass implements Superinterface {",
" @ToPrettyString",
" String toPretty2() {",
" return new String();",
" }",
"}",
"");
Compilation compilation = compile(superinterface, subclass);
assertThat(compilation).failed();
assertThat(compilation).hadErrorCount(1);
assertThat(compilation)
.hadErrorContaining(
error(
"test.Subclass has multiple @ToPrettyString methods:",
" - test.Superinterface.toPretty1()",
" - test.Subclass.toPretty2()"))
.inFile(subclass)
.onLineContaining("class Subclass");
}
private static Compilation compile(JavaFileObject... javaFileObjects) {
return javac().withProcessors(new ToPrettyStringValidator()).compile(javaFileObjects);
}
private static String error(String... lines) {
return String.join("\n ", lines);
}
}