/// <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)); }
/// <summary> /// 指定されたクラスまたはプログラムに指定されたフィールドやメソッドを追加します。 /// </summary> /// <param name = "program">メンバーを追加するモデルのルートノード</param> /// <param name = "name">対象となるクラスやプログラムを指定する名前</param> /// <param name = "members">挿入するメンバーのリスト</param> public static void AddIntertypeDeclaration( UnifiedProgram program, string name, List <UnifiedExpression> members) { //クラスのリストを取得(Java, C#向け) var classes = program.Descendants <UnifiedClassDefinition>(); if (classes.Count() > 0) { foreach (var c in classes) { //クラス名を取得 var className = c.Name as UnifiedVariableIdentifier; if (className == null) { continue; } //受け取った名前を正規表現に変換し、クラス名が一致する場合は合成する var regex = new Regex(name == "*" ? ".*" : name); var m = regex.Match(className.Name); if (m.Success) { foreach (var e in members) { c.Body.Insert(0, e.DeepCopy()); } } } return; } //TODO interfaceのようにUnifiedClassDefinitionがない場合はここまでくるのでどう対処するか //とりあえず応急処置 var interfaces = program.Descendants <UnifiedInterfaceDefinition>(); if (interfaces.Count() > 0) { return; } var enums = program.Descendants <UnifiedEnumDefinition>(); if (enums.Count() > 0) { return; } //プログラムに対してメンバーを追加(JavaScript向け)) if (program != null) { foreach (var e in members) { program.Body.Insert(0, e.DeepCopy()); } } }
/// <summary> /// 指定されたクラス名を持つクラスを,プログラム中から検索して取得します /// </summary> /// <param name="program"> (トップノードの)プログラムオブジェクト </param> /// <param name="className"> 検索するクラス名 </param> /// <returns> 検索したクラスの UnifiedClassDefinition オブジェクト(の集合) </returns> public static IEnumerable<UnifiedClassDefinition> FindClassByClassName( UnifiedProgram program, string className) { var result = program.Descendants<UnifiedClassDefinition>().Where( e => ((UnifiedIdentifier)(e.Name)).Name == className); return result; }
public static IEnumerable<UnifiedIdentifier> GetVariables( string name, UnifiedProgram codeObj) { var ids = codeObj.Descendants<UnifiedIdentifier>(); foreach (var id in ids) { if (id.Name.Equals(UnifiedIdentifier.CreateVariable(name).Name)) { yield return id; } } }
public void Setup() { //Java言語のモデルを作成 _javaModel = UnifiedGenerators.GenerateProgramFromFile(JavaCodePath); _amountOfBlockInJava = _javaModel.Descendants <UnifiedBlock>().Count(); //JavaScript言語のモデルを作成 _javaScriptModel = UnifiedGenerators.GenerateProgramFromFile(JavaScriptCodePath); _amountOfBlockInJavaScript = _javaScriptModel.Descendants <UnifiedBlock>().Count(); }
/// <summary> /// 指定されたクラスまたはプログラムに指定されたフィールドやメソッドを追加します。 /// </summary> /// <param name = "program">メンバーを追加するモデルのルートノード</param> /// <param name = "name">対象となるクラスやプログラムを指定する名前</param> /// <param name = "members">挿入するメンバーのリスト</param> public static void AddIntertypeDeclaration( UnifiedProgram program, string name, List<UnifiedExpression> members) { //クラスのリストを取得(Java, C#向け) var classes = program.Descendants<UnifiedClassDefinition>(); if (classes.Count() > 0) { foreach (var c in classes) { //クラス名を取得 var className = c.Name as UnifiedVariableIdentifier; if(className == null) continue; //受け取った名前を正規表現に変換し、クラス名が一致する場合は合成する var regex = new Regex(name == "*" ? ".*" : name); var m = regex.Match(className.Name); if (m.Success) { foreach (var e in members) { c.Body.Insert(0, e.DeepCopy()); } } } return; } //TODO interfaceのようにUnifiedClassDefinitionがない場合はここまでくるのでどう対処するか //とりあえず応急処置 var interfaces = program.Descendants<UnifiedInterfaceDefinition>(); if(interfaces.Count() > 0) return; var enums = program.Descendants<UnifiedEnumDefinition>(); if(enums.Count() > 0) return; //プログラムに対してメンバーを追加(JavaScript向け)) if (program != null) { foreach (var e in members) { program.Body.Insert(0, e.DeepCopy()); } } }
/// <summary> /// 子要素の列挙機能が正常に動作するかソースーコードを指定して検査します。 /// </summary> /// <param name="codeObject"> 検査対象のモデル </param> /// <param name="message"> アサーションに違反した際のエラーメッセージ </param> private static void AssertGetElements( UnifiedProgram codeObject, string message) { foreach (var element in codeObject.Descendants()) { var elements = element.Elements(); // Depends on field refelection var references = element.ElementReferences(); var referenecesOfPrivateFields = element.ElementReferencesOfFields(); var propValues = GetProperties(element).ToList(); // Depends on property reflection var refElements = references.Select(t => t.Element).ToList(); var privateRefElements = referenecesOfPrivateFields.Select(t => t.Element).ToList (); Assert.That(elements, Is.EqualTo(propValues), message); Assert.That(refElements, Is.EqualTo(propValues), message); Assert.That(privateRefElements, Is.EqualTo(propValues), message); } }
/// <summary> /// 深いコピーが正常に動作するか検査します. /// </summary> /// <param name="codeObject"> 検査対象のモデル </param> /// <param name="message"> アサーションに違反した際のエラーメッセージ </param> private static void AssertDeepCopy( UnifiedProgram codeObject, string message) { var copiedModel = codeObject.DeepCopy(); Assert.That( copiedModel, Is.EqualTo(codeObject).Using( StructuralEqualityComparerForDebug.Instance)); var pairs = copiedModel.Descendants().Zip(codeObject.Descendants()); foreach (var pair in pairs) { Assert.That(pair.Item1.Parent, Is.Not.Null, message); Assert.That( ReferenceEquals(pair.Item1.Parent, pair.Item2.Parent), Is.False, message); } }
/// <summary> /// 子要素とプロパティを介さないセッターの列挙機能が正常に動作するかソースーコードを指定して検査します。 /// </summary> /// <param name="codeObject"> 検査対象のモデル </param> /// <param name="message"> アサーションに違反した際のエラーメッセージ </param> private static void AssertGetElementReferenecesOfFields( UnifiedProgram codeObject, string message) { codeObject = codeObject.DeepCopy(); var elements = codeObject.Descendants().ToList(); foreach (var element in elements) { var references = element.ElementReferencesOfFields(); foreach (var reference in references) { reference.Element = null; } } foreach (var element in elements) { foreach (var child in element.Elements()) { Assert.That(child, Is.Null, message); } } }
public void Setup() { //Java言語のモデルを作成 _javaModel = UnifiedGenerators.GenerateProgramFromFile(JavaCodePath); _amountOfBlockInJava = _javaModel.Descendants<UnifiedBlock>().Count(); //JavaScript言語のモデルを作成 _javaScriptModel = UnifiedGenerators.GenerateProgramFromFile(JavaScriptCodePath); _amountOfBlockInJavaScript = _javaScriptModel.Descendants<UnifiedBlock>().Count(); }
// count statements of a unified code object private static int StatementNumber(UnifiedProgram codeObject) { var blocks = codeObject.Descendants<UnifiedBlock>(); var sum = 0; foreach (var block in blocks) { sum += block.Elements().Count(); } return sum; }