public void CannotUseNotUsableTypeAsAGenericArgument() { var nc = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "C1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} class C { public void F1<T>() {} public void M() { F1<C1>(); } }" }, metadataImporter: nc, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("generic argument") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("F1")); er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} interface I1<T> {} class C { public void F1<T>() {} public void M() { F1<I1<I1<C1>>>(); } }" }, metadataImporter: nc, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("generic argument") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("F1")); }
public void CannotUseNotUsableTypeAsATypeArgument() { var nc = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "C1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} class C { public void M() { var c = new C1(); } }" }, metadataImporter: nc, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("instance") && er.AllMessagesText[0].Contains("C1")); er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} class C2<T> {} class C { public void M() { var x = new C2<C2<C1>>(); } }" }, metadataImporter: nc, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("type argument") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("C2")); }
public void CannotUseNotUsableTypeInATypeOfExpression() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "C1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} class C { public void M() { var t = typeof(C1); } }" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("typeof") && er.AllMessagesText[0].Contains("C1")); er = new MockErrorReporter(false); Compile(new[] { @"class C1 {} interface I1<T> {} class C { public void M() { var t= typeof(I1<I1<C1>>); } }" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("typeof") && er.AllMessagesText[0].Contains("C1")); }
public void UsingUnusableClassAsABaseClassForAnotherUnusableClassIsNotAnError() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => TypeScriptSemantics.NotUsableFromScript() }; Compile(new[] { "class B {} class D : B {}" }, metadataImporter: metadataImporter); // No errors is good enough }
public void InterfaceThatIsNotUsableFromScriptCannotBeImplementedByAUsableClass() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "I1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { "interface I1 {} class C1 : I1 {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessages.Count, Is.EqualTo(1)); Assert.That(er.AllMessages[0].FormattedMessage.Contains("not usable from script") && er.AllMessages[0].FormattedMessage.Contains("inheritance list") && er.AllMessages[0].FormattedMessage.Contains("I1") && er.AllMessages[0].FormattedMessage.Contains("C1")); }
public void ClassThatIsNotUsableFromScriptCannotBeUsedAsABaseClassForAUsableClass() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "B1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { "class B1 {} class D1 : B1 {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessages.Count, Is.EqualTo(1)); Assert.That(er.AllMessages[0].FormattedMessage.Contains("not usable from script") && er.AllMessages[0].FormattedMessage.Contains("inheritance list") && er.AllMessages[0].FormattedMessage.Contains("B1") && er.AllMessages[0].FormattedMessage.Contains("D1")); metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "B1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; er = new MockErrorReporter(false); Compile(new[] { "class B1<T> {} class D1 : B1<int> {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessages.Count, Is.EqualTo(1)); Assert.That(er.AllMessages[0].FormattedMessage.Contains("not usable from script") && er.AllMessages[0].FormattedMessage.Contains("inheritance list") && er.AllMessages[0].FormattedMessage.Contains("B1") && er.AllMessages[0].FormattedMessage.Contains("D1")); }
public void ClassThatIsNotUsableFromScriptCannotBeUsedAsGenericArgumentForABaseClassOrImplementedInterface() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = t => t.Name == "C1" ? TypeScriptSemantics.NotUsableFromScript() : TypeScriptSemantics.NormalType(t.Name) }; var er = new MockErrorReporter(false); Compile(new[] { "class C1 {} class B1<T> {} class D1 : B1<C1> {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("inheritance list") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("D1")); er = new MockErrorReporter(false); Compile(new[] { "class C1 {} interface I1<T> {} class D1 : I1<C1> {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("inheritance list") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("D1")); er = new MockErrorReporter(false); Compile(new[] { "class C1 {} interface I1<T> {} class D1 : I1<I1<C1>> {}" }, metadataImporter: metadataImporter, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("not usable from script") && er.AllMessagesText[0].Contains("inheritance list") && er.AllMessagesText[0].Contains("C1") && er.AllMessagesText[0].Contains("D1")); }
public void ClassesWithGenerateCodeSetToFalseAndTheirNestedClassesAreNotInTheOutput() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = type => TypeScriptSemantics.NormalType(type.Name, generateCode: type.Name != "C2") }; Compile(new[] { "class C1 {} class C2 { class C3 {} }" }, metadataImporter: metadataImporter); CompiledTypes.Select(t => t.CSharpTypeDefinition.Name).Should().BeEquivalentTo(new[] { "C1", "C3" }); metadataImporter = new MockMetadataImporter { GetTypeSemantics = type => type.Name != "C2" ? TypeScriptSemantics.NormalType(type.Name) : TypeScriptSemantics.NotUsableFromScript() }; Compile(new[] { "class C1 {} class C2 { class C3 {} }" }, metadataImporter: metadataImporter); CompiledTypes.Select(t => t.CSharpTypeDefinition.Name).Should().BeEquivalentTo(new[] { "C1", "C3" }); }
public void EnumsWithGenerateCodeSetToFalseAreNotInTheOutput() { var metadataImporter = new MockMetadataImporter { GetTypeSemantics = type => TypeScriptSemantics.NormalType(type.Name, generateCode: type.Name != "C2") }; Compile(new[] { "enum C1 {} enum C2 {}" }, metadataImporter); CompiledTypes.Should().HaveCount(1); CompiledTypes[0].CSharpTypeDefinition.Name.Should().Be("C1"); metadataImporter = new MockMetadataImporter { GetTypeSemantics = type => type.Name != "C2" ? TypeScriptSemantics.NormalType(type.Name) : TypeScriptSemantics.NotUsableFromScript() }; Compile(new[] { "enum C1 {} enum C2 {}" }, metadataImporter); CompiledTypes.Should().HaveCount(1); CompiledTypes[0].CSharpTypeDefinition.Name.Should().Be("C1"); }