[tests] Port the ModelMustBeProtocol test from monotouch-test to cecil-test. (#19561)
It uses reflection, so it upsets NativeAOT, so just move it to cecil-test instead. This will make it run faster, and also more predictable (it's supposed to check all types, but types in monotouch-test may have been linked away). Ref: https://github.com/dotnet/runtime/issues/95444
This commit is contained in:
Родитель
d5f62b2758
Коммит
0e42551756
|
@ -583,5 +583,56 @@ namespace Cecil.Tests {
|
|||
|
||||
bool IsAvailabilityAttribute (CustomAttribute attribute) => IsSupportedAttribute (attribute) || attribute.AttributeType.Name == "UnsupportedOSPlatformAttribute";
|
||||
bool IsSupportedAttribute (CustomAttribute attribute) => attribute.AttributeType.Name == "SupportedOSPlatformAttribute";
|
||||
|
||||
[TestCaseSource (typeof (Helper), nameof (Helper.NetPlatformAssemblyDefinitions))]
|
||||
public void ModelMustBeProtocol (AssemblyInfo info)
|
||||
{
|
||||
// Verify that all types with a [Model] attribute must also have a [Protocol] attribute.
|
||||
// Exception: If the type in question has a [Register] attribute with IsWrapper = false, then that's OK.
|
||||
var failures = new HashSet<string> ();
|
||||
var typesWithModelAttribute = 0;
|
||||
var typesWithProtocolAttribute = 0;
|
||||
var assembly = info.Assembly;
|
||||
|
||||
foreach (var type in assembly.EnumerateTypes ()) {
|
||||
if (!type.HasCustomAttributes)
|
||||
continue;
|
||||
|
||||
var attributes = type.CustomAttributes;
|
||||
|
||||
if (!attributes.Any (v => v.AttributeType.Is ("Foundation", "ModelAttribute")))
|
||||
continue;
|
||||
typesWithModelAttribute++;
|
||||
|
||||
if (attributes.Any (v => v.AttributeType.Is ("Foundation", "ProtocolAttribute"))) {
|
||||
typesWithProtocolAttribute++;
|
||||
continue;
|
||||
}
|
||||
|
||||
var registerAttribute = attributes.SingleOrDefault (v => v.AttributeType.Is ("Foundation", "RegisterAttribute"));
|
||||
if (registerAttribute is not null && !GetIsWrapper (registerAttribute))
|
||||
continue;
|
||||
|
||||
failures.Add ($"The type {type.FullName} has a [Model] attribute, but no [Protocol] attribute.");
|
||||
}
|
||||
|
||||
Assert.That (failures, Is.Empty, "Failures");
|
||||
Assert.That (typesWithModelAttribute, Is.GreaterThan (0), "No types with the [Model] attribute?");
|
||||
Assert.That (typesWithProtocolAttribute, Is.GreaterThan (0), "No types with the [Protocol] attribute?");
|
||||
|
||||
static bool GetIsWrapper (CustomAttribute attrib)
|
||||
{
|
||||
// .ctor (string name, bool isWrapper)
|
||||
if (attrib.ConstructorArguments.Count == 2)
|
||||
return (bool) attrib.ConstructorArguments [1].Value;
|
||||
|
||||
// public bool IsWrapper { get; set; }
|
||||
foreach (var field in attrib.Fields) {
|
||||
if (field.Name == "IsWrapper")
|
||||
return (bool) field.Argument.Value;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,52 +0,0 @@
|
|||
//
|
||||
// Unit tests for ProtocolAttribute (yeah, really!)
|
||||
//
|
||||
// Authors:
|
||||
// Rolf Bjarne Kvinge <rolf@xamarin.com>
|
||||
//
|
||||
// Copyright 2013 Xamarin Inc. All rights reserved.
|
||||
//
|
||||
|
||||
using System;
|
||||
using Foundation;
|
||||
using ObjCRuntime;
|
||||
using NUnit.Framework;
|
||||
|
||||
namespace MonoTouchFixtures.Foundation {
|
||||
|
||||
[TestFixture]
|
||||
[Preserve (AllMembers = true)]
|
||||
public class ProtocolAttributeTest {
|
||||
|
||||
[Test]
|
||||
public void ModelMustBeProtocol ()
|
||||
{
|
||||
int count = 0;
|
||||
|
||||
//
|
||||
// Note that [Model], but no [Protocol] is not a universal truth (so it's
|
||||
// not enforced in the generator), but it should be true for monotouch.dll.
|
||||
//
|
||||
|
||||
foreach (var type in typeof (NSObject).Assembly.GetTypes ()) {
|
||||
if (!type.IsSubclassOf (typeof (NSObject)))
|
||||
continue;
|
||||
|
||||
var register = (RegisterAttribute) Attribute.GetCustomAttribute (type, typeof (RegisterAttribute), false);
|
||||
if (register is not null && !register.IsWrapper)
|
||||
continue;
|
||||
|
||||
if (Attribute.GetCustomAttribute (type, typeof (ModelAttribute), false) is null)
|
||||
continue;
|
||||
|
||||
if (Attribute.GetCustomAttribute (type, typeof (ProtocolAttribute), false) is null) {
|
||||
Console.WriteLine ("{0} must have a [Protocol] attribute if it has a [Model] attribute", type.FullName);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
Assert.Fail ("Found {0} types with a [Model] attribute (and no [Register(false)] attribute signalling that they're not wrapper types), but without a [Protocol] attribute.", count);
|
||||
}
|
||||
}
|
||||
}
|
Загрузка…
Ссылка в новой задаче