Method* addDivBySix(Model::Model* model, Class* parent) { Method* divbysix = nullptr; if (!parent) divbysix = dynamic_cast<Method*> (model->createRoot("Method")); model->beginModification(parent? static_cast<Model::Node*> (parent) : divbysix, "Adding a divBySix method."); if (!divbysix) { divbysix = new Method(); parent->methods()->append(divbysix); } divbysix->setName("findDivBySix"); FormalResult* divbysixResult = new FormalResult(); divbysixResult->setTypeExpression(new PrimitiveTypeExpression(PrimitiveTypeExpression::PrimitiveTypes::INT)); divbysix->results()->append(divbysixResult); FormalArgument* arg = new FormalArgument(); divbysix->arguments()->append(arg); arg->setName("numbers"); ArrayTypeExpression* argType = new ArrayTypeExpression(); argType->setTypeExpression(new PrimitiveTypeExpression(PrimitiveTypeExpression::PrimitiveTypes::INT)); arg->setTypeExpression(argType); VariableDeclarationExpression* result = new VariableDeclarationExpression("result"); divbysix->items()->append(new ExpressionStatement(result)); result->decl()->setTypeExpression(new PrimitiveTypeExpression(PrimitiveTypeExpression::PrimitiveTypes::INT)); result->decl()->setInitialValue(new IntegerLiteral(-1)); LoopStatement* sixloop = new LoopStatement(); divbysix->items()->append(sixloop); VariableDeclarationExpression* sixLoopInit = new VariableDeclarationExpression("i"); sixloop->setInitStep(sixLoopInit); sixLoopInit->decl()->setTypeExpression(new PrimitiveTypeExpression(PrimitiveTypeExpression::PrimitiveTypes::INT)); sixLoopInit->decl()->setInitialValue(new IntegerLiteral(0)); BinaryOperation* sixLoopCond = new BinaryOperation(); sixloop->setCondition(sixLoopCond); sixLoopCond->setLeft(new ReferenceExpression("i")); sixLoopCond->setOp(BinaryOperation::LESS); MethodCallExpression* sizeCall = new MethodCallExpression("size", new ReferenceExpression("numbers")); sixLoopCond->setRight(sizeCall); //TODO test the visualization without the remaining parts of this method AssignmentExpression* sixLoopUpdate = new AssignmentExpression(); sixloop->setUpdateStep(sixLoopUpdate); sixLoopUpdate->setLeft(new ReferenceExpression("i")); sixLoopUpdate->setOp(AssignmentExpression::PLUS_ASSIGN); sixLoopUpdate->setRight(new IntegerLiteral(1)); VariableDeclarationExpression* n = new VariableDeclarationExpression("n"); sixloop->body()->append(new ExpressionStatement(n)); n->decl()->setTypeExpression(new PrimitiveTypeExpression(PrimitiveTypeExpression::PrimitiveTypes::INT)); BinaryOperation* item = new BinaryOperation(); n->decl()->setInitialValue(item); item->setLeft(new ReferenceExpression("numbers")); item->setOp(BinaryOperation::ARRAY_INDEX); item->setRight(new ReferenceExpression("i")); IfStatement* ifdiv2 = new IfStatement(); sixloop->body()->append(ifdiv2); BinaryOperation* eq0 = new BinaryOperation(); ifdiv2->setCondition(eq0); eq0->setOp(BinaryOperation::EQUALS); eq0->setRight(new IntegerLiteral(0)); BinaryOperation* div2 = new BinaryOperation(); eq0->setLeft(div2); div2->setLeft(new ReferenceExpression("n")); div2->setOp(BinaryOperation::REMAINDER); div2->setRight(new IntegerLiteral(2)); ifdiv2->elseBranch()->append(new ContinueStatement()); IfStatement* ifdiv3 = new IfStatement(); ifdiv2->thenBranch()->append(ifdiv3); eq0 = new BinaryOperation(); ifdiv3->setCondition(eq0); eq0->setOp(BinaryOperation::EQUALS); eq0->setRight(new IntegerLiteral(0)); BinaryOperation* div3 = new BinaryOperation(); eq0->setLeft(div3); div3->setLeft(new ReferenceExpression("n")); div3->setOp(BinaryOperation::REMAINDER); div3->setRight(new IntegerLiteral(3)); AssignmentExpression* resultFound = new AssignmentExpression(); ifdiv3->thenBranch()->append(resultFound); resultFound->setLeft(new ReferenceExpression("result")); resultFound->setOp(AssignmentExpression::ASSIGN); resultFound->setRight(new ReferenceExpression("i")); ifdiv3->thenBranch()->append( new BreakStatement()); ReturnStatement* divbysixFinalReturn = new ReturnStatement(); divbysixFinalReturn->values()->append(new ReferenceExpression("result")); divbysix->items()->append(divbysixFinalReturn); model->endModification(); return divbysix; }
TEST(OOModel, JavaLibraryAndHelloWorldTest) { Model::Model model; Project* prj = dynamic_cast<Project*> (model.createRoot("Project")); model.beginModification(prj, "build simple java library and a hello world app"); prj->setName("HelloWorld"); // Build a simple Java Library Library* java = prj->libraries()->append<Library>(); java->setName("Java"); Class* string = java->classes()->append<Class>(); string->setName("String"); string->setVisibility(Visibility::PUBLIC); Module* io = java->modules()->append<Module>(); io->setName("io"); Class* printstream = io->classes()->append<Class>(); printstream->setName("PrintStream"); printstream->setVisibility(Visibility::PUBLIC); Method* println = printstream->methods()->append<Method>(); println->setName("println"); println->setVisibility(Visibility::PUBLIC); FormalArgument* arg = println->arguments()->append<FormalArgument>(); arg->setName("x"); NamedType* argType = arg->setType<NamedType>(); argType->type()->ref()->set("class:String"); Class* system = java->classes()->append<Class>(); system->setName("System"); system->setVisibility(Visibility::PUBLIC); Field* out = system->fields()->append<Field>(); out->setName("out"); out->setVisibility(Visibility::PUBLIC); out->setStorageSpecifier(StorageSpecifier::CLASS_VARIABLE); NamedType* outtype = out->setType<NamedType>(); outtype->type()->ref()->set("class:PrintStream"); outtype->type()->setPrefix<ReferenceExpression>()->ref()->set("mod:io"); // Build a simple HelloWorld Application Class* hello = prj->classes()->append<Class>(); hello->setName("HelloWorld"); hello->setVisibility(Visibility::PUBLIC); Method* main = hello->methods()->append<Method>(); main->setName("main"); main->setVisibility(Visibility::PUBLIC); main->setStorageSpecifier(StorageSpecifier::CLASS_VARIABLE); //TODO make an array argument MethodCallStatement* callPrintln = main->items()->append<MethodCallStatement>(); StringLiteral* helloStr = callPrintln->arguments()->append<StringLiteral>(); helloStr->setValue("Hello World"); callPrintln->ref()->set("met:println"); VariableAccess* va = callPrintln->setPrefix<VariableAccess>(); va->ref()->set("field:out"); ReferenceExpression* ref = va->setPrefix<ReferenceExpression>(); ref->ref()->set("lib:Java,class:System"); model.endModification(); CHECK_STR_EQUAL("Java", java->name()); CHECK_CONDITION(callPrintln->methodDefinition() != nullptr); CHECK_CONDITION(callPrintln->methodDefinition() == println); }
Method* addDivBySix(Model::Model* model, Class* parent) { Method* divbysix = nullptr; if (!parent) divbysix = dynamic_cast<Method*> (model->createRoot("Method")); model->beginModification(parent? static_cast<Model::Node*> (parent) : divbysix, "Adding a divBySix method."); if (!divbysix) { divbysix = new Method(); parent->methods()->append(divbysix); } divbysix->setName("findDivBySix"); FormalResult* divbysixResult = new FormalResult(); divbysixResult->setType(new PrimitiveType(PrimitiveType::INT)); divbysix->results()->append(divbysixResult); FormalArgument* arg = new FormalArgument(); divbysix->arguments()->append(arg); arg->setName("numbers"); ArrayType* argType = new ArrayType(); argType->setType(new PrimitiveType(PrimitiveType::INT)); arg->setType(argType); ExpressionStatement* es = new ExpressionStatement(); es->setExpression( new EmptyExpression()); divbysix->items()->append(es); VariableDeclaration* exprtest = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest)); exprtest->setName("exprtest"); exprtest->setType(new PrimitiveType(PrimitiveType::INT)); exprtest->setInitialValue( OOExpressionBuilder::getOOExpression("+aa++&b,*e/d-#") ); VariableDeclaration* exprtest2 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest2)); exprtest2->setName("exprtest2"); exprtest2->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest2->setInitialValue( OOExpressionBuilder::getOOExpression("a*b+c/e-d++%--e*-f==g") ); VariableDeclaration* exprtest3 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest3)); exprtest3->setName("exprtest3"); exprtest3->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest3->setInitialValue( OOExpressionBuilder::getOOExpression("a<b||c>d&&e<=f|g&h^~i") ); VariableDeclaration* exprtest4 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest4)); exprtest4->setName("exprtest4"); exprtest4->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest4->setInitialValue( OOExpressionBuilder::getOOExpression("new value[5]") ); VariableDeclaration* exprtest5 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest5)); exprtest5->setName("exprtest5"); exprtest5->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest5->setInitialValue( OOExpressionBuilder::getOOExpression("(castto)object") ); VariableDeclaration* exprtest6 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest6)); exprtest6->setName("exprtest6"); exprtest6->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest6->setInitialValue( OOExpressionBuilder::getOOExpression("{a,bb,ccc}") ); VariableDeclaration* exprtest7 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest7)); exprtest7->setName("exprtest7"); exprtest7->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest7->setInitialValue( OOExpressionBuilder::getOOExpression("{{123,hello},{2,b}}") ); VariableDeclaration* exprtest8 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest8)); exprtest8->setName("exprtest8"); exprtest8->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest8->setInitialValue( OOExpressionBuilder::getOOExpression("a.b+c.d[i].f") ); VariableDeclaration* exprtest9 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest9)); exprtest9->setName("exprtest9"); exprtest9->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest9->setInitialValue( OOExpressionBuilder::getOOExpression("a()+a.b()+a.b[i].f().g()") ); VariableDeclaration* exprtest10 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest10)); exprtest10->setName("exprtest10"); exprtest10->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest10->setInitialValue( OOExpressionBuilder::getOOExpression("this.b(a,b,c,123,false)") ); VariableDeclaration* exprtest11 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest11)); exprtest11->setName("exprtest11"); exprtest11->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest11->setInitialValue( OOExpressionBuilder::getOOExpression("a+\"hello world\"") ); VariableDeclaration* exprtest12 = new VariableDeclaration(); divbysix->items()->append(new ExpressionStatement(exprtest12)); exprtest12->setName("exprtest12"); exprtest12->setType(new PrimitiveType(PrimitiveType::VOID)); exprtest12->setInitialValue( OOExpressionBuilder::getOOExpression("int[]") ); auto exprtest13 = dynamic_cast<AssignmentExpression*>( OOExpressionBuilder::getOOExpression("a=b%=c>>>=d+C")); divbysix->items()->append(new ExpressionStatement(exprtest13)); divbysix->items()->append(new ExpressionStatement( OOExpressionBuilder::getOOExpression("int abc"))); divbysix->items()->append(new ExpressionStatement( OOExpressionBuilder::getOOExpression("int abc=5+3"))); divbysix->items()->append(new ExpressionStatement( OOExpressionBuilder::getOOExpression("int cond=abc<50?42:b+c"))); VariableDeclaration* result = new VariableDeclaration(); divbysix->items()->append( new ExpressionStatement(result) ); result->setName("result"); result->setType(new PrimitiveType(PrimitiveType::INT)); result->setInitialValue(new IntegerLiteral(-1)); LoopStatement* sixloop = new LoopStatement(); divbysix->items()->append(sixloop); VariableDeclaration* sixLoopInit = new VariableDeclaration(); sixloop->setInitStep(sixLoopInit); sixLoopInit->setName("i"); sixLoopInit->setType(new PrimitiveType(PrimitiveType::INT)); sixLoopInit->setInitialValue(new IntegerLiteral(0)); BinaryOperation* sixLoopCond = new BinaryOperation(); sixloop->setCondition(sixLoopCond); sixLoopCond->setLeft(new VariableAccess("local:i")); sixLoopCond->setOp(BinaryOperation::LESS); MethodCallExpression* sizeCall = new MethodCallExpression(); sixLoopCond->setRight(sizeCall); sizeCall->ref()->set("size"); sizeCall->setPrefix(new VariableAccess("local:numbers")); //TODO test the visualization without the remaining parts of this method AssignmentExpression* sixLoopUpdate = new AssignmentExpression(); sixloop->setUpdateStep(sixLoopUpdate); sixLoopUpdate->setLeft(new VariableAccess("local:i")); sixLoopUpdate->setOp(AssignmentExpression::PLUS_ASSIGN); sixLoopUpdate->setRight(new IntegerLiteral(1)); VariableDeclaration* n = new VariableDeclaration(); sixloop->body()->append(new ExpressionStatement(n)); n->setName("n"); n->setType(new PrimitiveType(PrimitiveType::INT)); BinaryOperation* item = new BinaryOperation(); n->setInitialValue(item); item->setLeft(new VariableAccess("local:numbers")); item->setOp(BinaryOperation::ARRAY_INDEX); item->setRight(new VariableAccess("local:i")); IfStatement* ifdiv2 = new IfStatement(); sixloop->body()->append(ifdiv2); BinaryOperation* eq0 = new BinaryOperation(); ifdiv2->setCondition(eq0); eq0->setOp(BinaryOperation::EQUALS); eq0->setRight(new IntegerLiteral(0)); BinaryOperation* div2 = new BinaryOperation(); eq0->setLeft(div2); div2->setLeft(new VariableAccess("local:n")); div2->setOp(BinaryOperation::REMAINDER); div2->setRight(new IntegerLiteral(2)); ifdiv2->elseBranch()->append(new ContinueStatement()); IfStatement* ifdiv3 = new IfStatement(); ifdiv2->thenBranch()->append(ifdiv3); eq0 = new BinaryOperation(); ifdiv3->setCondition(eq0); eq0->setOp(BinaryOperation::EQUALS); eq0->setRight(new IntegerLiteral(0)); BinaryOperation* div3 = new BinaryOperation(); eq0->setLeft(div3); div3->setLeft(new VariableAccess("local:n")); div3->setOp(BinaryOperation::REMAINDER); div3->setRight(new IntegerLiteral(3)); AssignmentExpression* resultFound = new AssignmentExpression(); ifdiv3->thenBranch()->append(resultFound); resultFound->setLeft(new VariableAccess("local:result")); resultFound->setOp(AssignmentExpression::ASSIGN); resultFound->setRight(new VariableAccess("local:i")); ifdiv3->thenBranch()->append(new BreakStatement()); ReturnStatement* divbysixReturn = new ReturnStatement(); divbysixReturn->values()->append(new VariableAccess("local:result")); divbysix->items()->append(divbysixReturn); model->endModification(); return divbysix; }