/// <summary> /// Java言語向けにアスペクトが正しく合成されるかどうかをテストします /// </summary> /// <param name="aspectFile">入力アスペクトファイル名</param> /// <param name="expectationFile">アスペクト合成後の期待値ファイル名</param> public void AssertCorrectWeavingForJava(string aspectFile, string expectationFile) { //アスペクトモデルの作成 var aspectPath = FixtureUtil.GetAspectPath(aspectFile); Weaver.AnalizeAspect(aspectPath); //アスペクトの合成処理 Weaver.Weave("Java", _javaModel); //期待されるモデルの作成 var filePath = FixtureUtil.GetAspectExpectationPath(expectationFile); var expectation = UnifiedGenerators.GenerateProgramFromFile(filePath); //for debug var gen = new JavaCodeGenerator(); Console.Write(gen.Generate(_javaModel)); //モデル内のブロック数が1増えているかどうか Assert.That( _amountOfBlockInJava + 1, Is.EqualTo(_javaModel.Descendants<UnifiedBlock>().Count())); //構造が一致しているかどうか Assert.That( _javaModel, Is.EqualTo(expectation).Using(StructuralEqualityComparer.Instance)); }
public void Setポイントカットを用いて代入文の直前にアスペクトを合成できる() { const string code = @"class A{ public void M() { int a = 10; int b; b = a; } }"; //モデル化 var model = CreateProgramFromCode(".java", code); var beforeNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //アスペクトの合成 Set.InsertAtBeforeSet(model, new Regex("b"), UcoGenerator.CreateAdvice("Java", "System.out.println();")); var afterNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //for debug var gen = new JavaCodeGenerator(); Console.Write(gen.Generate(model)); //アスペクトが合成されるためブロックの数が1つ増える Assert.That(afterNumBlock, Is.EqualTo(beforeNumBlock + 1)); }
public void For文を含まない関数にアスペクトを合成する() { //for文を含まないメソッドを定義 const string code = @"class A{ public void M() { int i = 0; while(i < 10) { i++; } } }"; //モデル化 var model = CreateProgramFromCode(".java", code); var beforeNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //アスペクトの合成 Execution.InsertAtBeforeExecutionByName( model, "M", typeof(UnifiedFor), UcoGenerator.CreateAdvice("Java", "System.out.println();")); var afterNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //for debug var gen = new JavaCodeGenerator(); Console.Write(gen.Generate(model)); //For文が含まれていないので合成の前後でコードが変わらない Assert.That(afterNumBlock, Is.EqualTo(beforeNumBlock)); }
public void Statement数の閾値を5としてStatementを5つ持つ関数にアスペクトを合成する() { //statementを5つ含むメソッドを定義 const string code = @"class A{ public void M() { int a = 0; a = 1; a = 2; a = 3; a = 4; }}"; //モデル化 var model = CreateProgramFromCode(".java", code); var beforeNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //アスペクトの合成 Execution.InsertAtBeforeExecutionByName(model, "M", 5, UcoGenerator.CreateAdvice("Java", "System.out.println();")); var afterNumBlock = model.Descendants().OfType<UnifiedBlock>().Count(); //for debug var gen = new JavaCodeGenerator(); Console.Write(gen.Generate(model)); Assert.That(afterNumBlock, Is.EqualTo(beforeNumBlock + 1)); }
static JavaFactory() { CodeGenerator = new JavaCodeGenerator(); ProgramGenerator = new JavaProgramGenerator(); }
public void 特殊文字を含むアドバイス内の変数を指定された文字列に置き換えられる() { var code = "System.out.println(JOINPOINT_NAME + \" is executed!\");"; var advice = UcoGenerator.CreateAdvice("Java", code); //アドバイス内の特殊文字を置き換える Execution.ReplaceSpecialToken(advice, "test"); code = "System.out.println(\"test\" + \" is executed!\");"; var actual = UcoGenerator.CreateAdvice("Java", code); var gen = new JavaCodeGenerator(); Console.WriteLine(gen.Generate(advice)); Assert.That(gen.Generate(advice), Is.EqualTo(gen.Generate(actual))); }