private ClassDeclarationSyntax ImplementInterfaceByChild(string childClassName) { var sourceCode = new SourceCode(Files.Interface); var childClass = sourceCode.Class(childClassName); var startPos = childClass.GetLocation().SourceSpan.Start; // create a mixin class that implements an interface var mixin = Substitute.For<MixinReference>(); var @class = Substitute.For<ClassWithTypeSymbol>(); @class.IsInterface.Returns(false); @class.Interfaces.Returns( new InterfaceList( new Interface(sourceCode.GetTypeByName(nameof(IFirstInterface))))); mixin.Class.Returns(@class); var interfaces = new InterfaceList(new[] { new Interface(sourceCode.GetTypeByName(nameof(IFirstInterface))) }); var addInterfaceWriter = new AddInterfacesToChildSyntaxWriter(mixin,sourceCode.Semantic, startPos); var newChildClass = addInterfaceWriter.Visit(childClass); return (ClassDeclarationSyntax)newChildClass; }
public void ChildWithOneInterface_IncludeMixinWithManyInterfaces_OnlyMissingInterfacesAdded() { var sourceCode = new SourceCode(Files.Interface); var childClass = sourceCode.Class(nameof(ChildWithInterface)); var startPos = childClass.GetLocation().SourceSpan.Start; var interfaces = new InterfaceList(new[] { new Interface(sourceCode.GetTypeByName(nameof(IFirstInterface))), new Interface(sourceCode.GetTypeByName(nameof(ISecondInterface))) }); var @class = Substitute.For<ClassWithTypeSymbol>(); @class.IsInterface.Returns(false); @class.Interfaces.Returns(interfaces); var mixin = Substitute.For<MixinReference>(); mixin.Class.Returns(@class); var addInterfaceWriter = new AddInterfacesToChildSyntaxWriter(mixin, sourceCode.Semantic, startPos); var newChildClass = (ClassDeclarationSyntax)addInterfaceWriter.Visit(childClass); var baseList = newChildClass.BaseList.Types; // assert: child class should have both interfaces Assert.AreEqual(2, baseList.Count); Assert.IsNotNull( baseList.Single(x => x.TypeName() == nameof(IFirstInterface))); Assert.IsNotNull( baseList.Single(x => x.TypeName() == nameof(ISecondInterface))); }
public void MixinIsInterface_Include_MixinAddedAsInterface() { var sourceCode = new SourceCode(Files.Interface); var childClass = sourceCode.Class(nameof(ChildWithoutInterface)); var startPos = childClass.GetLocation().SourceSpan.Start; // the mixin will be an interface var @class = Substitute.For<ClassWithTypeSymbol>(); @class.IsInterface.Returns(true); @class.AsInterface().Returns(new Interface(sourceCode.GetTypeByName(nameof(IFirstInterface)))); var mixin = Substitute.For<MixinReference>(); mixin.Class.Returns(@class); // act var addInterfaceWriter = new AddInterfacesToChildSyntaxWriter(mixin, sourceCode.Semantic, startPos); var newChildClass = (ClassDeclarationSyntax)addInterfaceWriter.Visit(childClass); var baseList = newChildClass.BaseList.Types; // assert: child class should have the mixin as interface Assert.AreEqual(1, baseList.Count); Assert.IsNotNull(baseList.Single(x => x.TypeName() == nameof(IFirstInterface))); }
public void MixinIsInterfaceInDifferentNamespace_Include_MixinAddedAsFullQualifiedInterface() { var sourceCode = new SourceCode(Files.Interface); var childClass = sourceCode.Class(nameof(ChildWithoutInterface)); // changing the start position here will force the type resolver // to use a full qualified type name var startPos = 0; // the mixin will be an interface var @class = Substitute.For<ClassWithTypeSymbol>(); @class.IsInterface.Returns(true); @class.AsInterface().Returns(new Interface( sourceCode.GetTypeByName(nameof(IFirstInterface)))); var mixin = Substitute.For<MixinReference>(); mixin.Class.Returns(@class); // act var addInterfaceWriter = new AddInterfacesToChildSyntaxWriter(mixin, sourceCode.Semantic, startPos); var newChildClass = (ClassDeclarationSyntax)addInterfaceWriter.Visit(childClass); var baseList = newChildClass.BaseList.Types; // assert: child class should have the mixin as interface Assert.AreEqual(1, baseList.Count); Assert.IsNotNull(baseList.Single(x => x.TypeName() == "MixinRefactoring.Test.IFirstInterface")); }