package joist.sourcegen;
import java.util.List;
import joist.util.Join;
import org.junit.Assert;
import org.junit.Test;
public class GClassTest {
@Test
public void testEmptyClass() {
GClass gc = new GClass("Foo");
Assert.assertEquals(Join.lines(//
"public class Foo {",
"",
"}",
""), gc.toCode());
}
@Test
public void testEmptyClassWithPackage() {
GClass gc = new GClass("foo.bar.Foo");
Assert.assertEquals(Join.lines(//
"package foo.bar;",
"",
"public class Foo {",
"",
"}",
""), gc.toCode());
}
@Test
public void testOneMethod() {
GClass gc = new GClass("foo.bar.Foo");
GMethod hello = gc.getMethod("hello");
hello.arguments("String foo");
hello.setBody("return 'Hi' + foo;");
Assert.assertEquals(
Join.lines(new Object[] {
"package foo.bar;",
"",
"public class Foo {",
"",
" public void hello(String foo) {",
" return \"Hi\" + foo;",
" }",
"",
"}",
"" }),
gc.toCode());
}
@Test
public void testOneMethodWithImports() {
GClass gc = new GClass("foo.bar.Foo");
gc.addImports("com.project.Foo");
gc.addImports("com.project.Foo");
gc.addImports("com.project.Bar");
Assert.assertEquals(Join.lines(new Object[] {
"package foo.bar;",
"",
"import com.project.Bar;",
"import com.project.Foo;",
"",
"public class Foo {",
"",
"}",
"" }), gc.toCode());
}
@Test
public void testTwoMethods() {
GClass gc = new GClass("foo.bar.Foo");
GMethod hello = gc.getMethod("hello");
hello.arguments("String foo");
hello.setBody("return 'Hi' + foo;");
GMethod goodbye = gc.getMethod("goodbye");
goodbye.arguments("String foo");
goodbye.setBody("return 'Bye' + foo;");
Assert.assertEquals(
Join.lines(new Object[] {
"package foo.bar;",
"",
"public class Foo {",
"",
" public void hello(String foo) {",
" return \"Hi\" + foo;",
" }",
"",
" public void goodbye(String foo) {",
" return \"Bye\" + foo;",
" }",
"",
"}",
"" }),
gc.toCode());
}
@Test
public void testOneMethodWithThreeLines() {
GClass gc = new GClass("foo.bar.Foo");
GMethod hello = gc.getMethod("hello").returnType("int");
hello.arguments("String foo");
hello.body.line(0, "int i = 0;");
hello.body.line(0, "if (foo.equals(\"foo\")) {");
hello.body.line(1, "i = 1;");
hello.body.line(0, "}");
hello.body.line(0, "return i;");
Assert.assertEquals(
Join.lines(new Object[] {
"package foo.bar;",
"",
"public class Foo {",
"",
" public int hello(String foo) {",
" int i = 0;",
" if (foo.equals(\"foo\")) {",
" i = 1;",
" }",
" return i;",
" }",
"",
"}",
"" }),
gc.toCode());
}
@Test
public void testOneMethodWithMultipleArguments() {
GClass gc = new GClass("foo.bar.Foo");
GMethod hello = gc.getMethod("hello");
hello.argument("String", "foo").argument("Integer", "bar");
hello.setBody("return 'Hi' + foo;");
Assert.assertEquals(Join.linesWithTickToQuote(
"package foo.bar;",
"",
"public class Foo {",
"",
" public void hello(String foo, Integer bar) {",
" return 'Hi' + foo;",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testGenericWithPackages() {
GClass gc = new GClass("Foo<java.lang.Object>");
Assert.assertEquals(null, gc.getPackageName());
Assert.assertEquals("Foo", gc.getFullName());
}
@Test
public void testGenericWithPackagesInPackages() {
GClass gc = new GClass("com.app.Foo<java.lang.Object>");
Assert.assertEquals("com.app", gc.getPackageName());
Assert.assertEquals("com.app.Foo", gc.getFullName());
}
@Test
public void testImplements() {
GClass gc = new GClass("foo.bar.Foo").implementsInterface(List.class);
Assert.assertEquals(Join.lines("package foo.bar;",//
"",
"import java.util.List;",
"",
"public class Foo implements List {",
"",
"}",
""), gc.toCode());
}
@Test
public void testInterfacesExtendsTwoInterfaces() {
GClass gc = new GClass("foo.Foo").setInterface();
gc.baseClassName("Base1");
gc.implementsInterface("Base2");
Assert.assertEquals(Join.lines("package foo;",//
"",
"public interface Foo extends Base1, Base2 {",
"",
"}",
""), gc.toCode());
}
@Test
public void testInterfaceThatIsEmpty() {
GClass gc = new GClass("foo.Foo").setInterface();
Assert.assertEquals(Join.lines("package foo;",//
"",
"public interface Foo {",
"",
"}",
""), gc.toCode());
}
@Test
public void testAnnotated() {
GClass gc = new GClass("foo.bar.Foo");
gc.addAnnotation("@SuppressWarnings");
Assert.assertEquals(Join.lines(new Object[] { "package foo.bar;",//
"",
"@SuppressWarnings",
"public class Foo {",
"",
"}",
"" }), gc.toCode());
}
@Test
public void testGetMethodMatchesArguments() {
GClass gc = new GClass("Foo");
GMethod m1 = gc.getMethod("foo(java.lang.String arg)");
GMethod m2 = gc.getMethod("foo(java.lang.String arg)");
Assert.assertSame(m1, m2);
GMethod m3 = gc.getMethod("foo(String arg1)");
Assert.assertSame(m1, m3);
GMethod m4 = gc.getMethod("bar()");
GMethod m5 = gc.getMethod("bar()");
Assert.assertSame(m4, m5);
}
@Test
public void testGetterSetter() {
GClass gc = new GClass("foo.bar.Foo");
gc.addGetterSetter("String", "foo");
Assert.assertEquals(
Join.lines(new Object[] {
"package foo.bar;",
"",
"public class Foo {",
"",
" private String foo;",
"",
" public String getFoo() {",
" return foo;",
" }",
"",
" public void setFoo(String foo) {",
" this.foo = foo;",
" }",
"",
"}",
"" }),
gc.toCode());
}
@Test
public void testIndentation() {
try {
GSettings.setDefaultIndentation(" ");
GClass gc = new GClass("foo.bar.Foo");
gc.addGetterSetter("String", "foo");
GMethod foo = gc.getMethod("foo");
foo.body.line("if (true) {");
foo.body.line("_ if (false) {");
foo.body.line("_ _ i++;");
foo.body.line("_ }");
foo.body.line("}");
Assert.assertEquals(
Join.lines(new Object[] {
"package foo.bar;",
"",
"public class Foo {",
"",
" private String foo;",
"",
" public String getFoo() {",
" return foo;",
" }",
"",
" public void setFoo(String foo) {",
" this.foo = foo;",
" }",
"",
" public void foo() {",
" if (true) {",
" if (false) {",
" i++;",
" }",
" }",
" }",
"",
"}",
"" }),
gc.toCode());
} finally {
GSettings.setDefaultIndentation(" ");
}
}
@Test
public void testEquals() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addEquals();
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public boolean equals(Object other) {",
" if (other != null && other instanceof Foo) {",
" final Foo o = (Foo) other;",
" return true",
" && ((o.foo == null && this.foo == null) || (o.foo != null && o.foo.equals(this.foo)))",
" && o.bar == this.bar",
" && java.util.Arrays.deepEquals(o.zaz, this.zaz)",
" ;",
" }",
" return false;",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testEqualsSubset() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addEquals("foo", "bar");
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public boolean equals(Object other) {",
" if (other != null && other instanceof Foo) {",
" final Foo o = (Foo) other;",
" return true",
" && ((o.foo == null && this.foo == null) || (o.foo != null && o.foo.equals(this.foo)))",
" && o.bar == this.bar",
" ;",
" }",
" return false;",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testHashCode() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addHashCode();
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public int hashCode() {",
" int hashCode = 23;",
" hashCode = (hashCode * 37) + getClass().hashCode();",
" hashCode = (hashCode * 37) + (foo == null ? 1 : foo.hashCode());",
" hashCode = (hashCode * 37) + new Boolean(bar).hashCode();",
" hashCode = (hashCode * 37) + java.util.Arrays.deepHashCode(zaz);",
" return hashCode;",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testHashCodeSubset() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addHashCode("foo", "bar");
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public int hashCode() {",
" int hashCode = 23;",
" hashCode = (hashCode * 37) + getClass().hashCode();",
" hashCode = (hashCode * 37) + (foo == null ? 1 : foo.hashCode());",
" hashCode = (hashCode * 37) + new Boolean(bar).hashCode();",
" return hashCode;",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testToString() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addToString();
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public String toString() {",
" return \"Foo[\"",
" + foo",
" + \", \"",
" + bar",
" + \", \"",
" + java.util.Arrays.toString(zaz)",
" + \"]\";",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testToStringSubset() {
GClass gc = new GClass("Foo");
gc.getField("foo").type("String");
gc.getField("bar").type("boolean");
gc.getField("zaz").type("String[]");
gc.addToString("foo", "bar");
Assert.assertEquals(Join.lines(
"public class Foo {",
"",
" private String foo;",
" private boolean bar;",
" private String[] zaz;",
"",
" @Override",
" public String toString() {",
" return \"Foo[\"",
" + foo",
" + \", \"",
" + bar",
" + \"]\";",
" }",
"",
"}",
""), gc.toCode());
}
@Test
public void testToStringWithBaseClass() {
GDirectory d = new GDirectory("./");
GClass base = d.getClass("p.Base");
base.getField("a").type("String");
GClass foo = d.getClass("p.Foo");
foo.baseClassName("Base");
foo.getField("b").type("String");
// have to pass both a and b for now
foo.addToString("a", "b");
Assert.assertEquals(Join.lines(
"package p;",
"",
"public class Foo extends Base {",
"",
" private String b;",
"",
" @Override",
" public String toString() {",
" return \"Foo[\"",
" + a",
" + \", \"",
" + b",
" + \"]\";",
" }",
"",
"}",
""), foo.toCode());
}
@Test
public void testToStringWithGrandparentClass() {
GDirectory d = new GDirectory("./");
GClass grand = d.getClass("p.Grand");
grand.getField("a").type("String");
GClass parent = d.getClass("p.Parent");
parent.baseClassName("Grand");
parent.getField("b").type("String");
GClass child = d.getClass("p.Child");
child.baseClassName("Parent");
child.getField("c").type("String");
// have to pass both a and b for now
child.addToString("a", "b", "c");
Assert.assertEquals(Join.lines(
"package p;",
"",
"public class Child extends Parent {",
"",
" private String c;",
"",
" @Override",
" public String toString() {",
" return \"Child[\"",
" + a",
" + \", \"",
" + b",
" + \", \"",
" + c",
" + \"]\";",
" }",
"",
"}",
""), child.toCode());
}
}