private void implementInitProxyProperties(final ClassStructureBuilder<?> proxyImpl, final Injectable injectable) { final BlockBuilder<?> initBody = proxyImpl .publicMethod(void.class, "initProxyProperties", finalOf(injectable.getInjectedType(), "instance")).body(); for (final Entry<String, Statement> prop : controller.getProxyProperties()) { proxyImpl.privateField(prop.getKey(), prop.getValue().getType()).finish(); initBody.append(loadVariable(prop.getKey()).assignValue(prop.getValue())); } initBody.finish(); }
@Test public void testForLoopChainedWithCountingExpression() { String s = StatementBuilder.create() .declareVariable("i", Integer.class, 0) .loadVariable("i") .for_(Stmt.loadVariable("i").assignValue(0), Bool.expr(BooleanOperator.LessThan, 100), StatementBuilder.create().loadVariable("i").assignValue(AssignmentOperator.PreIncrementAssign, 1)) .finish().toJavaString(); assertEquals("Failed to generate for loop with initializer and counting expression and chained lhs", FOR_CHAINED_INITIALIZER_COUNTING_EXP_EMPTY, s); }
@Test public void testAssignArrayValueWithPreIncrementAssignment() { final String s = StatementBuilder.create() .declareVariable("twoDimArray", String[][].class) .loadVariable("twoDimArray", 1, 2) .assignValue(AssignmentOperator.PreIncrementAssign, "test") .toJavaString(); assertEquals("Failed to generate array assignment", "twoDimArray[1][2] += \"test\";", s); }
@Test public void testAssignArrayValue() { final String s = StatementBuilder.create() .declareVariable("twoDimArray", String[][].class) .loadVariable("twoDimArray", 1, 2) .assignValue("test") .toJavaString(); assertEquals("Failed to generate array assignment", "twoDimArray[1][2] = \"test\";", s); }
@Test public void testDefineClassWithFieldInheritance() { final String cls = ClassBuilder .define("org.foo.Foo", Parent.class) .publicScope() .body() .publicConstructor() .append(Stmt.loadVariable("parentProtected").assignValue(0)) .append(Stmt.loadVariable("parentPublic").assignValue(0)) .finish() .toJavaString(); assertEquals("failed to generate class with parent", CLASS_WITH_FIELD_INHERITANCE, cls); }
@Test public void testForLoopUnchainedWithInitializerAndCountingExpression() { String s = StatementBuilder.create() .declareVariable("i", Integer.class) .for_(StatementBuilder.create().loadVariable("i").assignValue(0), Bool.expr(Variable.get("i"), BooleanOperator.LessThan, 100), StatementBuilder.create().loadVariable("i").assignValue(AssignmentOperator.PreIncrementAssign, 1)) .finish().toJavaString(); assertEquals("Failed to generate for loop with initializer and counting expression", FOR_INITIALIZER_COUNTING_EXP_EMPTY, s); }
@Test public void testAssignArrayValueWithInvalidArray() { try { StatementBuilder.create() .declareVariable("twoDimArray", String.class) .loadVariable("twoDimArray", 1, 2) .assignValue("test") .toJavaString(); fail("Expected InvalidTypeExcpetion"); } catch (InvalidTypeException e) { // Expected, variable is not an array. } }
private void implementEquals(final ClassStructureBuilder<?> proxyImpl) { proxyImpl.publicMethod(boolean.class, "equals", Parameter.of(Object.class, "obj")).body() .append(loadVariable("obj").assignValue(invokeStatic(Factory.class, "maybeUnwrapProxy", loadVariable("obj")))) .append(loadVariable("proxyHelper").invoke("getInstance", loadVariable("this")).invoke("equals", loadVariable("obj")).returnValue()) .finish(); }
@Test public void testAssignArrayValueWithVariableIndexes() { final String s = StatementBuilder.create() .declareVariable("twoDimArray", String[][].class) .declareVariable("i", int.class) .declareVariable("j", int.class) .loadVariable("twoDimArray", Variable.get("i"), Variable.get("j")) .assignValue("test") .toJavaString(); assertEquals("Failed to generate array assignment", "twoDimArray[i][j] = \"test\";", s); }
@Test public void testAssignField() { final String s = Stmt.create(Context.create().autoImport()).nestedCall( Stmt.newObject(Foo.class)).loadField("bar").loadField("name").assignValue("test").toJavaString(); assertEquals("failed to generate nested field assignment", "new Foo().bar.name = \"test\";", s); }
@Test public void testAssignInvalidField() { try { final String s = Stmt.create(Context.create().autoImport()).nestedCall( Stmt.newObject(Foo.class)) .loadField("invalid") .assignValue("test") .toJavaString(); fail("expected UndefinedFieldException"); } catch (UndefinedFieldException e) { // expected } }
@Test public void testForLoopChainedWithoutCountingExpression() { String s = StatementBuilder.create() .declareVariable("i", Integer.class, 0) .loadVariable("i") .for_(Stmt.loadVariable("i").assignValue(0), Bool.expr(BooleanOperator.LessThan, 100)) .finish().toJavaString(); assertEquals("Failed to generate for loop with initializer and chained lhs", FOR_CHAINED_INITIALIZER_NO_COUNTING_EXP_EMPTY, s); }
@Test public void testWhileLoopChainedWithEmptyExpressionWithBody() { String s = StatementBuilder.create() .declareVariable("b", Boolean.class) .loadVariable("b") .while_() .append(StatementBuilder.create().loadVariable("b").assignValue(false)) .finish().toJavaString(); assertEquals("Failed to generate while loop with chained lhs and body", WHILE_WITH_BODY, s); }
@Test public void testForLoopUnchainedWithInitializer() { String s = StatementBuilder.create() .declareVariable("i", Integer.class) .for_(StatementBuilder.create().loadVariable("i").assignValue(0), Bool.expr(Variable.get("i"), BooleanOperator.LessThan, 100)) .finish().toJavaString(); assertEquals("Failed to generate for loop with initializer", FOR_INITIALIZER_NO_COUNTING_EXP_EMPTY, s); }
@Test public void testIfElseIfBlockUsingNoRhsAndElseifKeyword() { Context c = ContextBuilder.create().addVariable("s", String.class).addVariable("n", Integer.class).getContext(); String s = StatementBuilder.create(c) .loadVariable("s") .invoke("endsWith", "abc") .if_() .append(StatementBuilder.create(c).loadVariable("n").assignValue(0)) .finish() .elseif_(StatementBuilder.create(c).loadVariable("s").invoke("startsWith", "def")) .append(StatementBuilder.create(c).loadVariable("n").assignValue(1)) .finish().toJavaString(); assertEquals("Failed to generate if-elseif block using no rhs", IF_ELSEIF_BLOCK_NO_RHS, s); }
@Test public void testDoWhileLoopChainedWithRhs() { String s = StatementBuilder.create() .declareVariable("n", Integer.class) .loadVariable("n") .do_() .append(StatementBuilder.create().loadVariable("n").assignValue(1)) .finish() .while_(BooleanOperator.GreaterThanOrEqual, 1) .toJavaString(); assertEquals("Failed to generate for do while loop with simple expression (no operator and rhs) and chained lhs", DOWHILE_SIMPLE_EXPRESSION, s); }
@Test public void testDoWhileLoopChainedWithoutRhs() { String s = StatementBuilder.create() .declareVariable("b", Boolean.class) .loadVariable("b") .do_() .append(StatementBuilder.create().loadVariable("b").assignValue(false)) .finish() .while_() .toJavaString(); assertEquals("Failed to generate for do while loop with simple expression (no operator and rhs) and chained lhs", DOWHILE_SIMPLE_EXPRESSION_NO_OP, s); }
@Test public void testDoWhileLoopUnchainedWithoutRhs() { String s = StatementBuilder.create() .declareVariable("b", Boolean.class) .do_() .append(StatementBuilder.create().loadVariable("b").assignValue(false)) .finish() .while_(Bool.expr(Variable.get("b"))) .toJavaString(); assertEquals("Failed to generate do while loop with simple expression (no operator and rhs)", DOWHILE_SIMPLE_EXPRESSION_NO_OP, s); }
@Test public void testAnonymousClassWithConstructor() { String src = ObjectBuilder.newInstanceOf(Bar.class, Context.create().autoImport()) .extend("test") .publicOverridesMethod("setName", Parameter.of(String.class, "name")) .append(Stmt.loadClassMember("name").assignValue(Variable.get("name"))) .finish() .finish() .toJavaString(); assertEquals("failed to generate anonymous class with overloaded construct", "new Bar(\"test\") {\n" + "public void setName(String name) {\n" + "this.name = name;\n" + "}\n" + "}", src); }
@Test public void testForLoopUnchainedWithDeclaringInitializerAndCountingExpression() { String s = StatementBuilder.create() .for_(Stmt.declareVariable(int.class).named("i").initializeWith(0), Bool.expr(Variable.get("i"), BooleanOperator.LessThan, 100), StatementBuilder.create().loadVariable("i").assignValue(AssignmentOperator.PreIncrementAssign, 1)) .append(StatementBuilder.create().loadStatic(System.class, "out").invoke("println", Variable.get("i"))) .finish().toJavaString(); assertEquals("Failed to generate for loop with declaring initializer and counting expression", FOR_DECLARE_INITIALIZER_COUNTING_EXP, s); }