xamarin-macios/tests/test-libraries/testgenerator.cs

1674 строки
83 KiB
C#

using System;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
static class C {
[Flags]
enum Architecture {
None = 0,
X86 = 1,
X64 = 2,
Arm32 = 4,
Armv7k = 8,
// Arm64 is never stret
}
// X86: structs > 8 + structs with 3 members.
// X64: structs > 16
// ARM32: all structs, except those matching an integral platform type (i.e. a struct with a single int, but not a struct with a single float).
// ARM64: never
// armv7k: > 16, except homogeneous types with no more than 4 elements (i.e. structs with 3 or 4 doubles).
// the numbers below are bitmasks of Architecture values.
static string [] structs_and_stret = {
/* integral types */
"c:0", "cc:4", "ccc:5", "cccc:4",
"s:0", "ss:4", "sss:5", "ssss:4",
"i:0", "ii:4", "iii:5", "iiii:5", "iiiii:15",
"l:4", "ll:5", "lll:15", "llll:15", "lllll:15",
/* floating point types */
"f:4", "ff:4", "fff:5", "ffff:5", "fffff:15",
"d:4", "dd:5", "ddd:7", "dddd:7", "ddddd:15",
/* mixed types */
"if:4", "fi:4", // 8 bytes
"iff:5", // 12 bytes
"iiff:5", // 16 bytes
"id:5", "di:5", // 16 bytes
"iid:5", // 16 bytes
"idi:15", // 16 bytes on i386 and 24 bytes on x86_64 (due to alignment)
"ddi:15", // 24 bytes
"didi:15", // 24 bytes on 32-bit arch, 32 bytes on 64-bit arch
"idid:15", // 24 bytes on 32-bit arch, 32 bytes on 64-bit arch
"dldl:15",
"ldld:15",
"fifi:5",
"ifif:5",
};
static string [] structs = structs_and_stret.Select ((v) => v.IndexOf (':') >= 0 ? v.Substring (0, v.IndexOf (':')) : v).ToArray ();
static Architecture [] strets = structs_and_stret.Select ((v) => v.IndexOf (':') >= 0 ? (Architecture) int.Parse (v.Substring (v.IndexOf (':') + 1)) : Architecture.None).ToArray ();
class BindAsData {
public string? Managed;
public string? Native;
public string? ManagedCondition;
public string? ManagedNewExpression;
public string? Map;
public string? MapFrom;
public Version? MinXcodeVersion;
public Version? MinMacOSVersion;
public string? ToNSNumberCastExpression;
public string? FromNSNumberCastExpression;
}
static BindAsData [] bindas_nsnumber = new [] {
new BindAsData { Managed = "Byte", Native = "uint8_t", ManagedNewExpression = "((byte) 1)", Map = ".ByteValue" },
new BindAsData { Managed = "SByte", Native = "int8_t", ManagedNewExpression = "((sbyte) 1)", Map = ".SByteValue" },
new BindAsData { Managed = "Int16", Native = "int16_t", ManagedNewExpression = "((short) 1)", Map = ".Int16Value" },
new BindAsData { Managed = "UInt16", Native = "uint16_t", ManagedNewExpression = "((ushort) 1)", Map = ".UInt16Value" },
new BindAsData { Managed = "Int32", Native = "int32_t", ManagedNewExpression = "((int) 1)", Map = ".Int32Value" },
new BindAsData { Managed = "UInt32", Native = "uint32_t", ManagedNewExpression = "((uint) 1)", Map = ".UInt32Value" },
new BindAsData { Managed = "Int64", Native = "int64_t", ManagedNewExpression = "((long) 1)", Map = ".Int64Value" },
new BindAsData { Managed = "UInt64", Native = "uint64_t", ManagedNewExpression = "((ulong) 1)", Map = ".UInt64Value" },
new BindAsData { Managed = "Single", Native = "float", ManagedNewExpression = "((float) 1.1)", Map = ".FloatValue" },
new BindAsData { Managed = "Double", Native = "double", ManagedNewExpression = "((double) 1.2)", Map = ".DoubleValue" },
new BindAsData { Managed = "nint", Native = "NSInteger", ManagedNewExpression = "((nint) 1)", Map = ".NIntValue" },
new BindAsData { Managed = "nuint", Native = "NSUInteger", ManagedNewExpression = "((nuint) 1)", Map = ".NUIntValue" },
new BindAsData { Managed = "nfloat", Native = "NSFloat", ManagedNewExpression = "((nfloat) 1)", Map = ".NFloatValue" },
new BindAsData { Managed = "Boolean", Native = "BOOL", ManagedNewExpression = "true", Map = ".BoolValue" },
new BindAsData { Managed = "NSStreamStatus", Native = "NSStreamStatus", ManagedNewExpression = "NSStreamStatus.Closed", Map = ".UInt64Value", ToNSNumberCastExpression = "(ulong) ", FromNSNumberCastExpression = "(NSStreamStatus) " },
};
static BindAsData [] bindas_nsvalue = new [] {
new BindAsData { Managed = "CGAffineTransform", Native = "CGAffineTransform", ManagedCondition = "!__MACOS__", ManagedNewExpression = "new CGAffineTransform (1, 2, 3, 4, 5, 6)", Map = ".CGAffineTransformValue", MapFrom = "FromCGAffineTransform" },
new BindAsData { Managed = "NSRange", Native = "NSRange", ManagedNewExpression = "new NSRange (7, 8)", Map = ".RangeValue", MapFrom = "FromRange" },
new BindAsData { Managed = "CGVector", Native = "CGVector", ManagedCondition = "!__MACOS__", ManagedNewExpression = "new CGVector (9, 10)", Map = ".CGVectorValue", MapFrom = "FromCGVector", MinXcodeVersion = new Version (8, 0) },
new BindAsData { Managed = "SCNMatrix4", Native = "SCNMatrix4", ManagedNewExpression = "SCNMatrix4.Identity", Map = ".SCNMatrix4Value", MapFrom = "FromSCNMatrix4", MinMacOSVersion = new Version (10, 10), MinXcodeVersion = new Version (8, 0) },
new BindAsData { Managed = "CLLocationCoordinate2D", Native = "CLLocationCoordinate2D", ManagedNewExpression = "new CLLocationCoordinate2D (11, 12)", Map = ".CoordinateValue", MapFrom = "FromMKCoordinate", MinMacOSVersion = new Version (10, 9) },
new BindAsData { Managed = "SCNVector3", Native = "SCNVector3", ManagedNewExpression = "new SCNVector3 (13, 14, 15)", Map = ".Vector3Value", MapFrom = "FromVector", MinMacOSVersion = new Version (10, 8), MinXcodeVersion = new Version (8, 0) },
new BindAsData { Managed = "SCNVector4", Native = "SCNVector4", ManagedNewExpression = "new SCNVector4 (16, 17, 18, 19)", Map = ".Vector4Value", MapFrom = "FromVector", MinMacOSVersion = new Version (10, 8), MinXcodeVersion = new Version (8, 0) },
new BindAsData { Managed = "CGPoint", Native = "CGPoint", ManagedCondition = "!__MACOS__", ManagedNewExpression = "new CGPoint (19, 20)", Map = ".CGPointValue", MapFrom = "FromCGPoint" },
new BindAsData { Managed = "CGSize", Native = "CGSize", ManagedCondition = "!__MACOS__", ManagedNewExpression = "new CGSize (21, 22)", Map = ".CGSizeValue", MapFrom = "FromCGSize" },
new BindAsData { Managed = "CGRect", Native = "CGRect", ManagedCondition = "!__MACOS__", ManagedNewExpression = "new CGRect (23, 24, 25, 26)", Map = ".CGRectValue", MapFrom = "FromCGRect" },
new BindAsData { Managed = "UIEdgeInsets", Native = "UIEdgeInsets", ManagedCondition = "HAVE_UIKIT", ManagedNewExpression = "new UIEdgeInsets (27, 28, 29, 30)", Map = ".UIEdgeInsetsValue", MapFrom = "FromUIEdgeInsets" },
new BindAsData { Managed = "UIOffset", Native = "UIOffset", ManagedCondition = "HAVE_UIKIT", ManagedNewExpression = "new UIOffset (31, 32)", Map = ".UIOffsetValue", MapFrom = "FromUIOffset" },
new BindAsData { Managed = "MKCoordinateSpan", Native = "MKCoordinateSpan", ManagedCondition = "HAVE_MAPKIT", ManagedNewExpression = "new MKCoordinateSpan (33, 34)", Map = ".CoordinateSpanValue", MapFrom = "FromMKCoordinateSpan", MinMacOSVersion = new Version (10, 9) },
new BindAsData { Managed = "CMTimeRange", Native = "CMTimeRange", ManagedCondition = "HAVE_COREMEDIA", ManagedNewExpression = "new CMTimeRange { Duration = new CMTime (37, 38), Start = new CMTime (39, 40) }", Map = ".CMTimeRangeValue", MapFrom = "FromCMTimeRange" },
new BindAsData { Managed = "CMTime", Native = "CMTime", ManagedCondition = "HAVE_COREMEDIA", ManagedNewExpression = "new CMTime (35, 36)", Map = ".CMTimeValue", MapFrom = "FromCMTime" },
new BindAsData { Managed = "CMTimeMapping", Native = "CMTimeMapping", ManagedCondition = "HAVE_COREMEDIA", ManagedNewExpression = "new CMTimeMapping { Source = new CMTimeRange { Duration = new CMTime (42, 43), Start = new CMTime (44, 45) } }", Map = ".CMTimeMappingValue", MapFrom = "FromCMTimeMapping" },
new BindAsData { Managed = "CMVideoDimensions", Native = "CMVideoDimensions", ManagedCondition = "HAVE_COREMEDIA", ManagedNewExpression = "new CMVideoDimensions { Height = 51, Width = 52 }", Map = ".CMVideoDimensionsValue", MapFrom = "FromCMVideoDimensions", MinXcodeVersion = new Version (14, 0) },
new BindAsData { Managed = "CATransform3D", Native = "CATransform3D", ManagedCondition = "HAVE_COREANIMATION", ManagedNewExpression = "new CATransform3D { M11 = 41 }", Map = ".CATransform3DValue", MapFrom = "FromCATransform3D" },
new BindAsData { Managed = "NSDirectionalEdgeInsets", Native = "NSDirectionalEdgeInsets", ManagedCondition = "HAVE_UIKIT", ManagedNewExpression = "new NSDirectionalEdgeInsets (42, 43, 44, 45)", Map = ".DirectionalEdgeInsetsValue", MapFrom = "FromDirectionalEdgeInsets", MinXcodeVersion = new Version (9, 0) },
};
static BindAsData [] bindas_nsstring = new [] {
new BindAsData { Managed = "SecKeyAlgorithm", ManagedNewExpression = "SecKeyAlgorithm.RsaSignatureRaw", MinXcodeVersion = new Version (8, 0) },
};
static string GetNativeName (char t)
{
switch (t) {
case 'f': return "float";
case 'd': return "double";
case 'c': return "char";
case 's': return "short";
case 'i': return "int";
case 'l': return "long long";
default:
throw new NotImplementedException ();
}
}
static string GetManagedName (char t)
{
switch (t) {
case 'f': return "float";
case 'd': return "double";
case 'c': return "byte";
case 's': return "short";
case 'i': return "int";
case 'l': return "long";
default:
throw new NotImplementedException ();
}
}
static string GetValue (char t, int i, int multiplier = 1)
{
switch (t) {
case 'c':
case 's':
case 'i':
case 'l': return ((i + 1) * multiplier).ToString (CultureInfo.InvariantCulture);
case 'f': return (3.14f * (i + 1) * multiplier).ToString (CultureInfo.InvariantCulture) + "f";
case 'd': return (1.23f * (i + 1) * multiplier).ToString (CultureInfo.InvariantCulture);
default:
throw new NotImplementedException ();
}
}
static void WriteLibTestStructH ()
{
var w = new StringBuilder ();
foreach (var s in structs) {
w.Append ($"struct S{s} {{ ");
for (int i = 0; i < s.Length; i++) {
w.Append (GetNativeName (s [i])).Append (" x").Append (i).Append ("; ");
}
w.AppendLine ($"}};");
w.AppendLine ($"typedef struct S{s} S{s};");
}
File.WriteAllText ("libtest.structs.h", w.ToString ());
}
static void WriteLibTestDecompileM ()
{
var w = new StringBuilder ();
// This is code to be disassembled to see how it's compiled by clang
// to see if a particular structure is using objc_msgSend_stret or not.
//
// To disassemble:
// otool -vVt .libs/ios/libtest.armv7.o
//
// Then in the _decompile_me output, look for the _____* function call,
// matching the structure you want to check, and then backtrack until
// you see either an objc_msgSend or objc_msgSend_stret call, and you
// have your answer.
#if false
w.AppendLine ("extern \"C\" {");
foreach (var s in structs)
w.AppendLine ($"void _____________________________________{s} (struct S{s} x) __attribute__ ((optnone)) {{ }}");
w.AppendLine ("void decompile_me () __attribute__ ((optnone))");
w.AppendLine ("{");
w.AppendLine ("\tObjCRegistrarTest *obj = NULL;");
foreach (var s in structs) {
w.AppendLine ($"\t_____________________________________{s} ([obj PS{s}]);");
}
w.AppendLine ("}");
w.AppendLine ("}");
#endif
File.WriteAllText ("libtest.decompile.m", w.ToString ());
}
static void WriteLibTestPropertiesH ()
{
var w = new StringBuilder ();
foreach (var s in structs)
w.AppendLine ($"\t@property struct S{s} PS{s};");
w.AppendLine ();
foreach (var v in bindas_nsnumber) {
w.AppendLine ($"\t@property (retain) NSNumber* P{v.Managed}Number;");
w.AppendLine ($"\t@property (retain) NSArray<NSNumber*> * P{v.Managed}Array;");
}
w.AppendLine ();
foreach (var v in bindas_nsvalue) {
w.AppendLine ($"\t@property (retain) NSValue* P{v.Managed}Value;");
w.AppendLine ($"\t@property (retain) NSArray<NSValue*> * P{v.Managed}Array;");
}
w.AppendLine ();
foreach (var v in bindas_nsstring) {
w.AppendLine ($"\t@property (retain) NSString *PSmart{v.Managed}Property;");
w.AppendLine ($"\t@property (retain) NSArray<NSString*> * PSmart{v.Managed}Properties;");
}
File.WriteAllText ("libtest.properties.h", w.ToString ());
}
static void WriteLibTestMethodsH ()
{
var w = new StringBuilder ();
w.AppendLine ();
foreach (var v in bindas_nsnumber) {
w.AppendLine ($"\t-(NSNumber *) get{v.Managed}NumberNonNullable;");
w.AppendLine ($"\t-(void) set{v.Managed}NumberNonNullable: (NSNumber *) value;");
w.AppendLine ();
w.AppendLine ($"\t-(NSNumber *) get{v.Managed}NumberNullable;");
w.AppendLine ($"\t-(void) set{v.Managed}NumberNullable: (NSNumber *) value;");
w.AppendLine ();
w.AppendLine ($"\t-(NSArray<NSNumber *> *) get{v.Managed}Array;");
w.AppendLine ($"\t-(void) set{v.Managed}Array: (NSArray<NSNumber *> *) value;");
w.AppendLine ();
}
w.AppendLine ();
foreach (var v in bindas_nsvalue) {
w.AppendLine ($"\t-(NSValue *) get{v.Managed}ValueNonNullable;");
w.AppendLine ($"\t-(void) set{v.Managed}ValueNonNullable: (NSValue *) value;");
w.AppendLine ();
w.AppendLine ($"\t-(NSValue *) get{v.Managed}ValueNullable;");
w.AppendLine ($"\t-(void) set{v.Managed}ValueNullable: (NSValue *) value;");
w.AppendLine ();
w.AppendLine ($"\t-(NSArray<NSValue *> *) get{v.Managed}Array;");
w.AppendLine ($"\t-(void) set{v.Managed}Array: (NSArray<NSValue *> *) value;");
w.AppendLine ();
}
w.AppendLine ();
foreach (var v in bindas_nsstring) {
// plain value
w.AppendLine ($"\t-(NSString *) getSmart{v.Managed}Value;");
w.AppendLine ($"\t-(void) setSmart{v.Managed}Value: (NSString *) value;");
w.AppendLine ();
// nullable
w.AppendLine ($"\t-(NSString *) getSmartNullable{v.Managed}Value;");
w.AppendLine ($"\t-(void) setSmartNullable{v.Managed}Value: (NSString *) value;");
w.AppendLine ();
// array of plain value
w.AppendLine ($"\t-(NSArray<NSString *> *) getSmart{v.Managed}Values;");
w.AppendLine ($"\t-(void) setSmart{v.Managed}Values: (NSArray<NSString *> *) value;");
w.AppendLine ();
}
File.WriteAllText ("libtest.methods.h", w.ToString ());
}
static void WriteLibTestMethodsM ()
{
var w = new StringBuilder ();
w.AppendLine ();
foreach (var v in bindas_nsnumber) {
w.AppendLine ($"\t-(NSNumber *) get{v.Managed}NumberNonNullable {{ return self.P{v.Managed}Number; }}");
w.AppendLine ($"\t-(void) set{v.Managed}NumberNonNullable: (NSNumber *) value {{ self.P{v.Managed}Number = value; }}");
w.AppendLine ();
w.AppendLine ($"\t-(NSNumber *) get{v.Managed}NumberNullable {{ return self.P{v.Managed}Number; }}");
w.AppendLine ($"\t-(void) set{v.Managed}NumberNullable: (NSNumber *) value {{ self.P{v.Managed}Number = value; }}");
w.AppendLine ();
w.AppendLine ($"\t-(NSArray<NSNumber *> *) get{v.Managed}Array {{ return self.P{v.Managed}Array; }}");
w.AppendLine ($"\t-(void) set{v.Managed}Array: (NSArray<NSNumber *> *) value {{ self.P{v.Managed}Array = value; }}");
w.AppendLine ();
}
w.AppendLine ();
foreach (var v in bindas_nsvalue) {
w.AppendLine ($"\t-(NSValue *) get{v.Managed}ValueNonNullable {{ return self.P{v.Managed}Value; }}");
w.AppendLine ($"\t-(void) set{v.Managed}ValueNonNullable: (NSValue *) value {{ self.P{v.Managed}Value = value; }}");
w.AppendLine ();
w.AppendLine ($"\t-(NSValue *) get{v.Managed}ValueNullable {{ return self.P{v.Managed}Value; }}");
w.AppendLine ($"\t-(void) set{v.Managed}ValueNullable: (NSValue *) value {{ self.P{v.Managed}Value = value; }}");
w.AppendLine ();
w.AppendLine ($"\t-(NSArray<NSValue *> *) get{v.Managed}Array {{ return self.P{v.Managed}Array; }}");
w.AppendLine ($"\t-(void) set{v.Managed}Array: (NSArray<NSValue *> *) value {{ self.P{v.Managed}Array = value; }}");
w.AppendLine ();
}
w.AppendLine ();
foreach (var v in bindas_nsstring) {
// plain value
w.AppendLine ($"\t-(NSString *) getSmart{v.Managed}Value {{ return self.PSmart{v.Managed}Property; }}");
w.AppendLine ($"\t-(void) setSmart{v.Managed}Value: (NSString *) value {{ self.PSmart{v.Managed}Property = value; }}");
w.AppendLine ();
// nullable
w.AppendLine ($"\t-(NSString *) getSmartNullable{v.Managed}Value {{ return self.PSmart{v.Managed}Property; }}");
w.AppendLine ($"\t-(void) setSmartNullable{v.Managed}Value: (NSString *) value {{ self.PSmart{v.Managed}Property = value; }}");
w.AppendLine ();
// array of plain value
w.AppendLine ($"\t-(NSArray<NSString *> *) getSmart{v.Managed}Values {{ return self.PSmart{v.Managed}Properties; }}");
w.AppendLine ($"\t-(void) setSmart{v.Managed}Values: (NSArray<NSString *> *) value {{ self.PSmart{v.Managed}Properties = value; }}");
w.AppendLine ();
}
File.WriteAllText ("libtest.methods.m", w.ToString ());
}
static void WriteFrameworkDefines (StringBuilder w)
{
w.AppendLine (@"
#if __IOS__ || __MACOS__ || __TVOS__
#define HAVE_COREANIMATION
#endif
#if __IOS__ || __MACOS__ || __TVOS__
#define HAVE_COREMEDIA
#endif
#if __IOS__ || __TVOS__
#define HAVE_UIKIT
#endif
#define HAVE_MAPKIT
");
}
static void WriteApiDefinition ()
{
var w = new StringBuilder ();
WriteFrameworkDefines (w);
w.AppendLine (@"
using System;
using AVFoundation;
#if HAVE_COREANIMATION
using CoreAnimation;
#endif
using CoreGraphics;
using CoreLocation;
#if HAVE_COREMEDIA
using CoreMedia;
#endif
using Foundation;
#if HAVE_MAPKIT
using MapKit;
#endif
using ObjCRuntime;
using SceneKit;
using Security;
#if HAVE_UIKIT
using UIKit;
#endif
namespace Bindings.Test {
partial interface ObjCRegistrarTest {
");
foreach (var s in structs) {
w.AppendLine ($"\t\t[Export (\"PS{s}\")]");
w.AppendLine ($"\t\tS{s} PS{s} {{ get; set; }}");
w.AppendLine ();
}
w.AppendLine ("\t\t// BindAs: NSNumber");
foreach (var v in bindas_nsnumber) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// no BindAs
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Number\")]");
w.AppendLine ($"\t\tNSNumber P{v.Managed}Number {{ get; set; }}");
// plain value
w.AppendLine ();
w.AppendLine ("\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Number\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\tNSNumber P{v.Managed}NumberNonNullable {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}NumberNonNullable\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\t[return: NullAllowed] // This should be the default");
w.AppendLine ($"\t\tNSNumber Get{v.Managed}NumberNonNullable ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}NumberNonNullable:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}NumberNonNullable ([BindAs (typeof ({v.Managed}))] NSNumber value);");
// nullable value
w.AppendLine ();
w.AppendLine ("\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Number\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\t[NullAllowed] // This should be the default");
w.AppendLine ($"\t\tNSNumber P{v.Managed}NumberNullable {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}NumberNullable\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\tNSNumber Get{v.Managed}NumberNullable ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}NumberNullable:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}NumberNullable ([BindAs (typeof ({v.Managed}?))] [NullAllowed /* this should be the default */] NSNumber value);");
// ref/out plain value is not supported (error BI1048: bgen: Unsupported type Boolean decorated with [BindAs])
// ref/out nullable value is not supported (error BI1048: bgen: Unsupported type Boolean decorated with [BindAs])
// array of plain value
w.AppendLine ();
w.AppendLine ("\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Array\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[NullAllowed]");
w.AppendLine ($"\t\tNSNumber[] P{v.Managed}Array {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}Array\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[return: NullAllowed]");
w.AppendLine ($"\t\tNSNumber[] Get{v.Managed}Array ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}Array:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}Array ([NullAllowed] [BindAs (typeof ({v.Managed}[]))] NSNumber[] value);");
// multidimensional array of plain value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57795
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}Multi1Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[,]))]");
//w.AppendLine ($"\t\tNSNumber[,] P{v.Managed}Multi1ArrayValue {{ get; set; }}");
// BI1048: bgen: Unsupported type Boolean[][] decorated with [BindAs]
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}Multi2Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[][]))]");
//w.AppendLine ($"\t\tNSNumber[][] P{v.Managed}Multi2ArrayValue {{ get; set; }}");
// array of nullable value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableArray\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\tNSNumber[] P{v.Managed}NullableArrayValue {{ get; set; }}");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"get{v.Managed}NullableArray\")]");
//w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\tNSNumber[] Get{v.Managed}NullableArrayValue ();");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"set{v.Managed}NullableArray:\")]");
//w.AppendLine ($"\t\tvoid Set{v.Managed}NullableArray ([BindAs (typeof ({v.Managed}?[]))] NSNumber[] value);");
// multidimensional array of nullable value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableMulti1Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[,]))]");
//w.AppendLine ($"\t\tNSNumber[,] P{v.Managed}NullableMulti1ArrayValue {{ get; set; }}");
// BI1048: bgen: Unsupported type Nullable`1[][] decorated with [BindAs]
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableMulti2Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[][]))]");
//w.AppendLine ($"\t\tNSNumber[][] P{v.Managed}NullableMulti2ArrayValue {{ get; set; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine ("\t\t// BindAs: NSValue");
foreach (var v in bindas_nsvalue) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// no BindAs
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Value\")]");
w.AppendLine ($"\t\tNSValue P{v.Managed}Value {{ get; set; }}");
// plain value
w.AppendLine ();
w.AppendLine ("\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Value\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\tNSValue P{v.Managed}ValueNonNullable {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}ValueNonNullable\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\t[return: NullAllowed] // This should be the default");
w.AppendLine ($"\t\tNSValue Get{v.Managed}ValueNonNullable ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}ValueNonNullable:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}ValueNonNullable ([BindAs (typeof ({v.Managed}))] NSValue value);");
// nullable
w.AppendLine ();
w.AppendLine ($"\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Value\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\t[NullAllowed] // This should be the default");
w.AppendLine ($"\t\tNSValue P{v.Managed}ValueNullable {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}ValueNullable\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\tNSValue Get{v.Managed}ValueNullable ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}ValueNullable:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}ValueNullable ([BindAs (typeof ({v.Managed}?))] [NullAllowed /* this should be the default */] NSValue value);");
// ref/out plain value is not supported (error BI1048: bgen: Unsupported type CATransform3D decorated with [BindAs])
// ref/out nullable value is not supported (error BI1048: bgen: Unsupported type CATransform3D decorated with [BindAs])
// array of plain value
w.AppendLine ();
w.AppendLine ("\t\t[Sealed]");
w.AppendLine ($"\t\t[Export (\"P{v.Managed}Array\")]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[NullAllowed]");
w.AppendLine ($"\t\tNSValue[] P{v.Managed}Array {{ get; set; }}");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"get{v.Managed}Array\")]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[return: NullAllowed]");
w.AppendLine ($"\t\tNSValue[] Get{v.Managed}Array ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"set{v.Managed}Array:\")]");
w.AppendLine ($"\t\tvoid Set{v.Managed}Array ([NullAllowed] [BindAs (typeof ({v.Managed}[]))] NSValue[] value);");
// multidimensional array of plain value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57795
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}Multi1Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[,]))]");
//w.AppendLine ($"\t\tNSValue[,] P{v.Managed}Multi1ArrayValue {{ get; set; }}");
// BI1048: bgen: Unsupported type CATransform3D[][] decorated with [BindAs]
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}Multi2Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[][]))]");
//w.AppendLine ($"\t\tNSValue[][] P{v.Managed}Multi2ArrayValue {{ get; set; }}");
// array of nullable value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableArray\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\tNSValue[] P{v.Managed}NullableArrayValue {{ get; set; }}");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"get{v.Managed}NullableArray\")]");
//w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\tNSValue[] Get{v.Managed}NullableArrayValue ();");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"set{v.Managed}NullableArray:\")]");
//w.AppendLine ($"\t\tvoid Set{v.Managed}NullableArray ([BindAs (typeof ({v.Managed}?[]))] NSValue[] value);");
// multidimensional array of nullable value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableMulti1Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[,]))]");
//w.AppendLine ($"\t\tNSValue[,] P{v.Managed}NullableMulti1 {{ get; set; }}");
// BI1048: bgen: Unsupported type Nullable`1[][] decorated with [BindAs]
//w.AppendLine ();
//w.AppendLine ("\t\t[Sealed]");
//w.AppendLine ($"\t\t[Export (\"P{v.Managed}NullableMulti2Array\")]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[][]))]");
//w.AppendLine ($"\t\tNSValue[][] P{v.Managed}NullableMulti2ArrayValue {{ get; set; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine ("\t\t// BindAs: NSString");
foreach (var v in bindas_nsstring) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// plain value
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\t[Export (\"getSmart{v.Managed}Value\")]");
w.AppendLine ($"\t\tNSString GetSmart{v.Managed}Value ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"setSmart{v.Managed}Value:\")]");
w.AppendLine ($"\t\tvoid SetSmart{v.Managed}Value ([BindAs (typeof ({v.Managed}))] NSString value);");
w.AppendLine ();
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}))]");
w.AppendLine ($"\t\t[Export (\"PSmart{v.Managed}Property\")]");
w.AppendLine ($"\t\tNSString PSmart{v.Managed}Property {{ get; set; }}");
// nullable
w.AppendLine ();
w.AppendLine ($"\t\t[return: NullAllowed]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\t[Export (\"getSmartNullable{v.Managed}Value\")]");
w.AppendLine ($"\t\tNSString GetSmartNullable{v.Managed}Value ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"setSmartNullable{v.Managed}Value:\")]");
w.AppendLine ($"\t\tvoid SetSmartNullable{v.Managed}Value ([NullAllowed] [BindAs (typeof ({v.Managed}?))] NSString value);");
w.AppendLine ();
w.AppendLine ($"\t\t[NullAllowed]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?))]");
w.AppendLine ($"\t\t[Export (\"smartNullable{v.Managed}Property\")]");
w.AppendLine ($"\t\tNSString SmartNullable{v.Managed}Property {{ get; set; }}");
// array of plain value
w.AppendLine ();
w.AppendLine ($"\t\t[return: NullAllowed]");
w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[Export (\"getSmart{v.Managed}Values\")]");
w.AppendLine ($"\t\tNSString[] GetSmart{v.Managed}Values ();");
w.AppendLine ();
w.AppendLine ($"\t\t[Export (\"setSmart{v.Managed}Values:\")]");
w.AppendLine ($"\t\tvoid SetSmart{v.Managed}Values ([NullAllowed] [BindAs (typeof ({v.Managed}[]))] NSString[] value);");
w.AppendLine ();
w.AppendLine ($"\t\t[NullAllowed]");
w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[]))]");
w.AppendLine ($"\t\t[Export (\"PSmart{v.Managed}Properties\")]");
w.AppendLine ($"\t\tNSString[] PSmart{v.Managed}Properties {{ get; set; }}");
// array of nullable values
// https://bugzilla.xamarin.com/show_bug.cgi?id=57797
//w.AppendLine ();
//w.AppendLine ($"\t\t[return: NullAllowed]");
//w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\t[Export (\"getSmartNullable{v.Managed}Values\")]");
//w.AppendLine ($"\t\tNSString[] GetSmartNullable{v.Managed}Values ();");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"setSmartNullable{v.Managed}Values\")]");
//w.AppendLine ($"\t\tvoid SetSmartNullable{v.Managed}Values ([NullAllowed] [BindAs (typeof ({v.Managed}?[]))] NSString[] value);");
//w.AppendLine ();
//w.AppendLine ($"\t\t[NullAllowed]");
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}?[]))]");
//w.AppendLine ($"\t\t[Export (\"smartNullable{v.Managed}Properties:\")]");
//w.AppendLine ($"\t\tNSString[] SmartNullable{v.Managed}Properties {{ get; set; }}");
// multidimensional array of plain value
// https://bugzilla.xamarin.com/show_bug.cgi?id=57795
//w.AppendLine ();
//w.AppendLine ($"\t\t[return: BindAs (typeof ({v.Managed}[,]))]");
//w.AppendLine ($"\t\t[Export (\"getSmart{v.Managed}ValuesMulti\")]");
//w.AppendLine ($"\t\tNSString[,] GetSmart{v.Managed}ValuesMulti ();");
//w.AppendLine ();
//w.AppendLine ($"\t\t[Export (\"setSmart{v.Managed}ValuesMulti:\")]");
//w.AppendLine ($"\t\tvoid SetSmart{v.Managed}ValuesMulti ([BindAs (typeof ({v.Managed}[]))] NSString[,] value);");
//w.AppendLine ();
//w.AppendLine ($"\t\t[BindAs (typeof ({v.Managed}[,]))]");
//w.AppendLine ($"\t\t[Export (\"PSmart{v.Managed}PropertiesMulti:\")]");
//w.AppendLine ($"\t\tNSString[,] PSmart{v.Managed}PropertiesMulti {{ get; set; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
// multi-dimensional array of plain value
w.AppendLine (@" }
}");
File.WriteAllText ("../bindings-test/ApiDefinition.generated.cs", w.ToString ());
}
static void WriteStructsAndEnums ()
{
var w = new StringBuilder ();
w.AppendLine (@"using System;
using System.Runtime.InteropServices;
namespace Bindings.Test
{
");
foreach (var s in structs) {
w.AppendLine ($"\tpublic struct S{s} {{ ");
w.Append ("\t\t");
for (int i = 0; i < s.Length; i++) {
w.Append ("public ").Append (GetManagedName (s [i])).Append (" x").Append (i).Append ("; ");
}
w.AppendLine ();
w.Append ($"\t\tpublic override string ToString () {{ return $\"S{s} [");
for (int i = 0; i < s.Length; i++) {
w.Append ("{x").Append (i).Append ("};");
}
w.Length--;
w.AppendLine ("]\"; } ");
w.AppendLine ("\t}");
w.AppendLine ();
}
w.AppendLine (@"}");
File.WriteAllText ("../bindings-test/StructsAndEnums.generated.cs", w.ToString ());
}
static void WriteAsserts (StringBuilder w, BindAsData v)
{
w.AppendLine ($"\t\t\tAssertIfIgnored ();");
if (v.MinXcodeVersion is not null) {
w.AppendLine ($"\t\t\tTestRuntime.AssertXcodeVersion ({v.MinXcodeVersion.Major}, {v.MinXcodeVersion.Minor});");
w.AppendLine ();
}
if (v.MinMacOSVersion is not null) {
w.AppendLine ($"\t\t\tTestRuntime.AssertSystemVersion (ApplePlatform.MacOSX, {v.MinMacOSVersion.Major}, {v.MinMacOSVersion.Minor}, throwIfOtherPlatform: false);");
w.AppendLine ();
}
}
static void WriteRegistrarTests ()
{
var w = new StringBuilder ();
WriteFrameworkDefines (w);
w.AppendLine (@"
using System;
using AVFoundation;
#if HAVE_COREANIMATION
using CoreAnimation;
#endif
using CoreGraphics;
using CoreLocation;
#if HAVE_COREMEDIA
using CoreMedia;
#endif
using Foundation;
#if HAVE_MAPKIT
using MapKit;
#endif
using ObjCRuntime;
using SceneKit;
using Security;
#if HAVE_UIKIT
using UIKit;
#endif
using MonoTouchException=ObjCRuntime.RuntimeException;
#if NET
using NativeException=ObjCRuntime.ObjCException;
#elif __MACOS__
using NativeException=Foundation.ObjCException;
#else
using NativeException=Foundation.MonoTouchException;
#endif
using NUnit.Framework;
using Bindings.Test;
using XamarinTests.ObjCRuntime;
using Xamarin.Utils;
namespace MonoTouchFixtures.ObjCRuntime {
[TestFixture]
[Preserve (AllMembers = true)]
public partial class RegistrarTestGenerated {");
foreach (var s in structs) {
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void Test_{s} ()");
w.AppendLine ("\t\t{");
w.AppendLine ($"\t\t\tAssertIfIgnored ();");
w.AppendLine ("\t\t\tusing (var tc = new ObjCRegistrarTest ()) {");
w.AppendLine ($"\t\t\t\tvar s = tc.PS{s};");
for (int i = 0; i < s.Length; i++)
w.AppendLine ($"\t\t\t\tAssert.AreEqual (0, s.x{i}, \"pre-#{i}\");");
w.Append ($"\t\t\t\tvar k = new S{s} () {{ ");
for (int i = 0; i < s.Length; i++)
w.Append ($"x{i} = ").Append (GetValue (s [i], i)).Append (", ");
w.Length -= 2;
w.AppendLine ("};");
w.AppendLine ($"\t\t\t\ttc.PS{s} = k;");
w.AppendLine ($"\t\t\t\ts = tc.PS{s};");
for (int i = 0; i < s.Length; i++)
w.AppendLine ($"\t\t\t\tAssert.AreEqual (k.x{i}, s.x{i}, \"post-#{i}\");");
w.AppendLine ("\t\t\t}");
w.AppendLine ("\t\t}");
w.AppendLine ();
}
w.AppendLine ("\t\tinternal class BindAsTestClassGenerated : ObjCRegistrarTest {");
w.AppendLine ("\t\t\t// BindAs: NSNumber");
foreach (var v in bindas_nsnumber) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
w.AppendLine ($"\t\t\t{v.Managed}? _{v.Managed};");
w.AppendLine ($"\t\t\tpublic {v.Managed}? {v.Managed}Number {{ get {{ return _{v.Managed}; }} set {{ _{v.Managed} = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}? Get{v.Managed}NumberNullable () {{ return _{v.Managed}; }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed} Get{v.Managed}NumberNonNullable () {{ return _{v.Managed}.Value; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}NumberNullable ({v.Managed}? value) {{ _{v.Managed} = value; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}NumberNonNullable ({v.Managed} value) {{ _{v.Managed} = value; }}");
w.AppendLine ();
w.AppendLine ($"\t\t\t{v.Managed}[] _{v.Managed}Array;");
w.AppendLine ($"\t\t\tpublic {v.Managed}[] {v.Managed}Array {{ get {{ return _{v.Managed}Array; }} set {{ _{v.Managed}Array = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}[] Get{v.Managed}Array () {{ return _{v.Managed}Array; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}Array ({v.Managed}[] value) {{ _{v.Managed}Array = value; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine ("\t\t\t// BindAs: NSValue");
foreach (var v in bindas_nsvalue) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
w.AppendLine ($"\t\t\t{v.Managed}? _{v.Managed};");
w.AppendLine ($"\t\t\tpublic {v.Managed}? {v.Managed}Value {{ get {{ return _{v.Managed}; }} set {{ _{v.Managed} = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}? Get{v.Managed}ValueNullable () {{ return _{v.Managed}; }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed} Get{v.Managed}ValueNonNullable () {{ return _{v.Managed}.Value; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}ValueNullable ({v.Managed}? value) {{ _{v.Managed} = value; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}ValueNonNullable ({v.Managed} value) {{ _{v.Managed} = value; }}");
w.AppendLine ();
w.AppendLine ($"\t\t\t{v.Managed}[] _{v.Managed}Array;");
w.AppendLine ($"\t\t\tpublic {v.Managed}[] {v.Managed}Array {{ get {{ return _{v.Managed}Array; }} set {{ _{v.Managed}Array = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}[] Get{v.Managed}Array () {{ return _{v.Managed}Array; }}");
w.AppendLine ($"\t\t\tpublic override void Set{v.Managed}Array ({v.Managed}[] value) {{ _{v.Managed}Array = value; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine ("\t\t\t// BindAs: NSString");
foreach (var v in bindas_nsstring) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
w.AppendLine ($"\t\t\t{v.Managed}? _{v.Managed};");
w.AppendLine ($"\t\t\tpublic {v.Managed}? {v.Managed}Value {{ get {{ return _{v.Managed}; }} set {{ _{v.Managed} = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed} PSmart{v.Managed}Property {{ get {{ return {v.Managed}Value.Value; }} set {{ {v.Managed}Value = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed} GetSmart{v.Managed}Value () {{ return _{v.Managed}.Value; }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}? GetSmartNullable{v.Managed}Value () {{ return _{v.Managed}; }}");
w.AppendLine ($"\t\t\tpublic override void SetSmart{v.Managed}Value ({v.Managed} value) {{ _{v.Managed} = value; }}");
w.AppendLine ($"\t\t\tpublic override void SetSmartNullable{v.Managed}Value ({v.Managed}? value) {{ _{v.Managed} = value; }}");
w.AppendLine ();
w.AppendLine ($"\t\t\t{v.Managed}[] _{v.Managed}Array;");
w.AppendLine ($"\t\t\tpublic {v.Managed}[] {v.Managed}Array {{ get {{ return _{v.Managed}Array; }} set {{ _{v.Managed}Array = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}[] PSmart{v.Managed}Properties {{ get {{ return _{v.Managed}Array; }} set {{ _{v.Managed}Array = value; }} }}");
w.AppendLine ($"\t\t\tpublic override {v.Managed}[] GetSmart{v.Managed}Values () {{ return _{v.Managed}Array; }}");
w.AppendLine ($"\t\t\tpublic override void SetSmart{v.Managed}Values ({v.Managed}[] value) {{ _{v.Managed}Array = value; }}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine ("\t\t}");
foreach (var v in bindas_nsnumber) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSNumberBindAs_{v.Managed}_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Number, \"initial null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}NumberNullable, \"initial nullable null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}NumberNullable (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}? value = default ({v.Managed});");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}NumberNonNullable (value.Value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}NumberNullable, \"nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.P{v.Managed}NumberNonNullable, \"non-nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}NumberNullable (), \"nullable get method after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.Get{v.Managed}NumberNonNullable (), \"non-nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}NumberNonNullable (value.Value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}NumberNullable, \"nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.P{v.Managed}NumberNonNullable, \"non-nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}NumberNullable (), \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.Get{v.Managed}NumberNonNullable (), \"non-nullable get method after setting custom value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}NumberNullable (value);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Number, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}NumberNullable, \"nullable null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}NumberNullable (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSNumberBindAs_{v.Managed}_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Number, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}NumberNullable:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Number, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Number = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}NumberNullable:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Number, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tusing (var input = new NSNumber ({v.ToNSNumberCastExpression}value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}NumberNullable:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.{v.Managed}Number, \"after setting A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Number = null;");
w.AppendLine ($"\t\t\t\tusing (var input = new NSNumber ({v.ToNSNumberCastExpression}value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}NumberNonNullable:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.{v.Managed}Number.Value, \"after setting B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Number = null;");
w.AppendLine ($"\t\t\t\tvar number = Runtime.GetNSObject<NSNumber> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}NumberNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.IsNull (number, \"null from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Number = value;");
w.AppendLine ($"\t\t\t\tnumber = Runtime.GetNSObject<NSNumber> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}NumberNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, {v.FromNSNumberCastExpression}number{v.Map}, \"getter B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Number = value;");
w.AppendLine ($"\t\t\t\tnumber = Runtime.GetNSObject<NSNumber> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}NumberNonNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, {v.FromNSNumberCastExpression}number{v.Map}, \"getter C\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
// Array_Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSNumberBindAs_{v.Managed}Array_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Array, \"initial null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}Array (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}[] value = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}Array, \"nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}Array (), \"nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.P{v.Managed}Array.Length, \"nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.Get{v.Managed}Array ().Length, \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.P{v.Managed}Array [0], \"nullable property after setting custom value element\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.Get{v.Managed}Array () [0], \"nullable get method after setting custom value element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Array, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}Array (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Array_Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSNumberBindAs_{v.Managed}_Array_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => new NSNumber ({v.ToNSNumberCastExpression}v), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.{v.Managed}Array.Length, \"after setting A\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.{v.Managed}Array [0], \"after setting A element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = null;");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => new NSNumber ({v.ToNSNumberCastExpression}v), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.{v.Managed}Array.Length, \"after setting B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.{v.Managed}Array [0], \"after setting B element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = null;");
w.AppendLine ($"\t\t\t\tvar array = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}Array\")));");
w.AppendLine ($"\t\t\t\tAssert.IsNull (array, \"null from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = value;");
w.AppendLine ($"\t\t\t\tarray = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}Array\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual ((nuint) value.Length, array.Count, \"getter B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], {v.FromNSNumberCastExpression}array.GetItem<NSNumber> (0){v.Map}, \"getter B element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
foreach (var v in bindas_nsvalue) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSValueBindAs_{v.Managed}_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Value, \"initial null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}ValueNullable, \"initial nullable null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}ValueNullable (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}? value = default ({v.Managed});");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}ValueNonNullable (value.Value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}ValueNullable, \"nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.P{v.Managed}ValueNonNullable, \"non-nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}ValueNullable (), \"nullable get method after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.Get{v.Managed}ValueNonNullable (), \"non-nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}ValueNonNullable (value.Value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}ValueNullable, \"nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.P{v.Managed}ValueNonNullable, \"non-nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}ValueNullable (), \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.Get{v.Managed}ValueNonNullable (), \"non-nullable get method after setting custom value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}ValueNullable (value);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Value, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}ValueNullable, \"nullable null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}ValueNullable (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSValueBindAs_{v.Managed}_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Value, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}ValueNullable:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Value, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Value = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}ValueNullable:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Value, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tusing (var input = NSValue.{v.MapFrom} (value))");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}ValueNullable:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.{v.Managed}Value, \"after setting A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Value = null;");
w.AppendLine ($"\t\t\t\tusing (var input = NSValue.{v.MapFrom} (value))");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}ValueNonNullable:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.{v.Managed}Value, \"after setting B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Value = null;");
w.AppendLine ($"\t\t\t\tvar Value = Runtime.GetNSObject<NSValue> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}ValueNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.IsNull (Value, \"null from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Value = value;");
w.AppendLine ($"\t\t\t\tValue = Runtime.GetNSObject<NSValue> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}ValueNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, Value{v.Map}, \"getter B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Value = value;");
w.AppendLine ($"\t\t\t\tValue = Runtime.GetNSObject<NSValue> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}ValueNonNullable\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, Value{v.Map}, \"getter C\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
// Array_Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSValueBindAs_{v.Managed}Array_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Array, \"initial null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}Array (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}[] value = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.P{v.Managed}Array, \"nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.Get{v.Managed}Array (), \"nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.P{v.Managed}Array.Length, \"nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.Get{v.Managed}Array ().Length, \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.P{v.Managed}Array [0], \"nullable property after setting custom value element\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.Get{v.Managed}Array () [0], \"nullable get method after setting custom value element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.Set{v.Managed}Array (value);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.P{v.Managed}Array, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.Get{v.Managed}Array (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Array_Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSValueBindAs_{v.Managed}_Array_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.{v.Managed}Array, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => NSValue.{v.MapFrom} (v), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.{v.Managed}Array.Length, \"after setting A\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.{v.Managed}Array [0], \"after setting A element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = null;");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => NSValue.{v.MapFrom} (v), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"set{v.Managed}Array:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.{v.Managed}Array.Length, \"after setting B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.{v.Managed}Array [0], \"after setting B element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = null;");
w.AppendLine ($"\t\t\t\tvar array = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}Array\")));");
w.AppendLine ($"\t\t\t\tAssert.IsNull (array, \"null from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.{v.Managed}Array = value;");
w.AppendLine ($"\t\t\t\tarray = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"get{v.Managed}Array\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual ((nuint) value.Length, array.Count, \"getter B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], array.GetItem<NSValue> (0){v.Map}, \"getter B element\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
foreach (var v in bindas_nsstring) {
if (v.ManagedCondition is not null)
w.AppendLine ($"#if {v.ManagedCondition}");
// Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSStringBindAs_{v.Managed}_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.Throws<ArgumentNullException> (() => {{ Console.WriteLine (obj.PSmart{v.Managed}Property); }}, \"initial zero property\");");
w.AppendLine ($"\t\t\t\tAssert.Throws<ArgumentNullException> (() => {{ Console.WriteLine (obj.GetSmart{v.Managed}Value ()); }}, \"initial zero method\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.GetSmartNullable{v.Managed}Value (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}? value = default ({v.Managed});");
w.AppendLine ($"\t\t\t\tobj.SetSmartNullable{v.Managed}Value (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.PSmart{v.Managed}Property, \"zero property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.GetSmart{v.Managed}Value (), \"non-nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.GetSmartNullable{v.Managed}Value (), \"nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.SetSmart{v.Managed}Value (value.Value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.PSmart{v.Managed}Property, \"non-nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.GetSmartNullable{v.Managed}Value (), \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Value, obj.GetSmart{v.Managed}Value (), \"non-nullable get method after setting custom value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.SetSmartNullable{v.Managed}Value (value);");
w.AppendLine ($"\t\t\t\tAssert.Throws<ArgumentNullException> (() => {{ Console.WriteLine (obj.PSmart{v.Managed}Property); }}, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.Throws<ArgumentNullException> (() => {{ Console.WriteLine (obj.GetSmart{v.Managed}Value ()); }}, \"non-nullable method after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.GetSmartNullable{v.Managed}Value (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSStringBindAs_{v.Managed}_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.Throws<InvalidOperationException> (() => {{ Console.WriteLine (obj.PSmart{v.Managed}Property); }}, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmartNullable{v.Managed}Value:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.Throws<InvalidOperationException> (() => {{ Console.WriteLine (obj.PSmart{v.Managed}Property); }}, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Property = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmartNullable{v.Managed}Value:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.Throws<InvalidOperationException> (() => {{ Console.WriteLine (obj.PSmart{v.Managed}Property); }}, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tusing (var input = value.GetConstant ())");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmartNullable{v.Managed}Value:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.PSmart{v.Managed}Property, \"after setting A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Property = 0;");
w.AppendLine ($"\t\t\t\tusing (var input = value.GetConstant ())");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmart{v.Managed}Value:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.PSmart{v.Managed}Property, \"after setting B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Property = 0;");
w.AppendLine ($"\t\t\t\tvar Value = Runtime.GetNSObject<NSString> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"getSmartNullable{v.Managed}Value\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (default ({v.Managed}).GetConstant ().ToString (), Value.ToString (), \"zero from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Property = value;");
w.AppendLine ($"\t\t\t\tValue = Runtime.GetNSObject<NSString> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"getSmartNullable{v.Managed}Value\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, {v.Managed}Extensions.GetValue (Value), \"getter B\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = {v.ManagedNewExpression};");
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Property = value;");
w.AppendLine ($"\t\t\t\tValue = Runtime.GetNSObject<NSString> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"getSmart{v.Managed}Value\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, {v.Managed}Extensions.GetValue (Value), \"getter C\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
// Array_Bindings
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSStringBindAs_{v.Managed}Array_Bindings ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new ObjCRegistrarTest ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.PSmart{v.Managed}Properties, \"initial null property\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.GetSmart{v.Managed}Values (), \"initial null method\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\t{v.Managed}[] value = null;");
w.AppendLine ($"\t\t\t\tobj.SetSmart{v.Managed}Values (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.PSmart{v.Managed}Properties, \"nullable property after setting default value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value, obj.GetSmart{v.Managed}Values (), \"nullable get method after setting default value\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.SetSmart{v.Managed}Values (value);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.PSmart{v.Managed}Properties.Length, \"nullable property after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (1, obj.GetSmart{v.Managed}Values ().Length, \"nullable get method after setting custom value\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.PSmart{v.Managed}Properties [0], \"nullable property after setting custom value element\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.GetSmart{v.Managed}Values () [0], \"nullable get method after setting custom value element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = null;");
w.AppendLine ($"\t\t\t\tobj.SetSmart{v.Managed}Values (value);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.PSmart{v.Managed}Properties, \"null property after setting null value\");");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.GetSmart{v.Managed}Values (), \"null method after setting null value\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
// Array_Overrides
w.AppendLine ("\t\t[Test]");
w.AppendLine ($"\t\tpublic void NSStringBindAs_{v.Managed}_Array_Overrides ()");
w.AppendLine ("\t\t{");
WriteAsserts (w, v);
w.AppendLine ($"\t\t\tusing (var obj = new BindAsTestClassGenerated ()) {{");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.PSmart{v.Managed}Properties, \"initial null\");");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmart{v.Managed}Values:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.PSmart{v.Managed}Properties, \"null after setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Properties = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmart{v.Managed}Values:\"), IntPtr.Zero);");
w.AppendLine ($"\t\t\t\tAssert.IsNull (obj.PSmart{v.Managed}Properties, \"null after re-setting null\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvar value = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => v.GetConstant (), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmart{v.Managed}Values:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.PSmart{v.Managed}Properties.Length, \"after setting A\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.PSmart{v.Managed}Properties [0], \"after setting A element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Properties = null;");
w.AppendLine ($"\t\t\t\tusing (var input = NSArray.FromNSObjects<{v.Managed}> ((v) => v.GetConstant (), value))");
w.AppendLine ($"\t\t\t\t\tMessaging.void_objc_msgSend_IntPtr (obj.Handle, Selector.GetHandle (\"setSmart{v.Managed}Values:\"), input.Handle);");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value.Length, obj.PSmart{v.Managed}Properties.Length, \"after setting B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], obj.PSmart{v.Managed}Properties [0], \"after setting B element\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Properties = null;");
w.AppendLine ($"\t\t\t\tvar array = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"getSmart{v.Managed}Values\")));");
w.AppendLine ($"\t\t\t\tAssert.IsNull (array, \"null from getter A\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\tvalue = new {v.Managed} [] {{ {v.ManagedNewExpression} }};");
w.AppendLine ($"\t\t\t\tobj.PSmart{v.Managed}Properties = value;");
w.AppendLine ($"\t\t\t\tarray = Runtime.GetNSObject<NSArray> (Messaging.IntPtr_objc_msgSend (obj.Handle, Selector.GetHandle (\"getSmart{v.Managed}Values\")));");
w.AppendLine ($"\t\t\t\tAssert.AreEqual ((nuint) value.Length, array.Count, \"getter B\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (value [0], {v.Managed}Extensions.GetValue (array.GetItem<NSString> (0)), \"getter B element\");");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ("\t\t}");
w.AppendLine ();
if (v.ManagedCondition is not null)
w.AppendLine ("#endif");
w.AppendLine ();
}
w.AppendLine (@" }
}");
File.WriteAllText ("RegistrarTest.generated.cs", w.ToString ());
}
static void WriteTrampolineTests ()
{
var w = new StringBuilder ();
WriteFrameworkDefines (w);
w.AppendLine (@"
using System;
using System.Runtime.InteropServices;
using Foundation;
using ObjCRuntime;
using NUnit.Framework;
using Bindings.Test;
using XamarinTests.ObjCRuntime;
using Xamarin.Utils;
namespace MonoTouchFixtures.ObjCRuntime {
[TestFixture]
[Preserve (AllMembers = true)]
public partial class TrampolineTestGenerated {");
w.AppendLine ("\t\tconst string LIBOBJC_DYLIB = \"/usr/lib/libobjc.dylib\";");
w.AppendLine ();
w.AppendLine ("\t\t[Register (\"GeneratedStretTrampolines\")]");
w.AppendLine ("\t\t[Preserve (AllMembers = true)]");
w.AppendLine ("\t\tpublic class GeneratedStretTrampolines : NSObject {");
foreach (var s in structs) {
w.AppendLine ();
w.AppendLine ($"\t\t\t// {s}");
w.AppendLine ();
w.AppendLine ($"\t\t\t[Export (\"Test_{s}Struct\")]");
w.AppendLine ($"\t\t\tS{s} Test_{s}Struct ()");
w.AppendLine ($"\t\t\t{{");
w.AppendLine ($"\t\t\t\treturn {GenerateNewExpression (s, 1)};");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ();
w.AppendLine ($"\t\t\t[Export (\"Test_Static{s}Struct\")]");
w.AppendLine ($"\t\t\tstatic S{s} Test_Static{s}Struct ()");
w.AppendLine ($"\t\t\t{{");
w.AppendLine ($"\t\t\t\treturn {GenerateNewExpression (s, 2)};");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ();
w.AppendLine ($"\t\t\tS{s} Test_{s}StructProperty {{");
w.AppendLine ($"\t\t\t\t[Export (\"Test_{s}StructProperty\")]");
w.AppendLine ($"\t\t\t\tget {{ return {GenerateNewExpression (s, 3)}; }}");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ();
w.AppendLine ($"\t\t\tstatic S{s} Test_Static{s}StructProperty {{");
w.AppendLine ($"\t\t\t\t[Export (\"Test_Static{s}StructProperty\")]");
w.AppendLine ($"\t\t\t\tget {{ return {GenerateNewExpression (s, 4)}; }}");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ();
w.AppendLine ($"\t\t\t[Export (\"Test_{s}Struct_out_double:\")]");
w.AppendLine ($"\t\t\tS{s} Test_{s}Struct (out double x0)");
w.AppendLine ($"\t\t\t{{");
w.AppendLine ($"\t\t\t\tx0 = 3.14;");
w.AppendLine ($"\t\t\t\treturn {GenerateNewExpression (s, 5)};");
w.AppendLine ($"\t\t\t}}");
w.AppendLine ();
w.AppendLine ($"\t\t\t[Export (\"Test_Static{s}Struct_out_float:\")]");
w.AppendLine ($"\t\t\tstatic S{s} Test_Static{s}Struct (out float x0)");
w.AppendLine ($"\t\t\t{{");
w.AppendLine ($"\t\t\t\tx0 = 3.15f;");
w.AppendLine ($"\t\t\t\treturn {GenerateNewExpression (s, 6)};");
w.AppendLine ($"\t\t\t}}");
}
w.AppendLine ("\t\t}");
foreach (var s in structs) {
bool never;
w.AppendLine ();
w.AppendLine ($"\t\t[Test]");
w.AppendLine ($"\t\tpublic void Test_{s} ()");
w.AppendLine ($"\t\t{{");
w.AppendLine ($"\t\t\tAssertIfIgnored ();");
w.AppendLine ($"\t\t\tIntPtr class_ptr = Class.GetHandle (typeof (GeneratedStretTrampolines));");
w.AppendLine ($"\t\t\tS{s} rv = new S{s} ();");
w.AppendLine ($"\t\t\tdouble rvd;");
w.AppendLine ($"\t\t\tfloat rvf;");
w.AppendLine ($"\t\t\tusing (var obj = new GeneratedStretTrampolines ()) {{");
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend (obj.Handle, new Selector (\"Test_{s}Struct\").Handle);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret (out rv, obj.Handle, new Selector (\"Test_{s}Struct\").Handle);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend (obj.Handle, new Selector (\"Test_{s}Struct\").Handle);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 1)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ();
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend (class_ptr, new Selector (\"Test_Static{s}Struct\").Handle);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret (out rv, class_ptr, new Selector (\"Test_Static{s}Struct\").Handle);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend (class_ptr, new Selector (\"Test_Static{s}Struct\").Handle);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 2)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ();
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend (obj.Handle, new Selector (\"Test_{s}StructProperty\").Handle);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret (out rv, obj.Handle, new Selector (\"Test_{s}StructProperty\").Handle);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend (obj.Handle, new Selector (\"Test_{s}StructProperty\").Handle);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 3)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ();
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend (class_ptr, new Selector (\"Test_Static{s}StructProperty\").Handle);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret (out rv, class_ptr, new Selector (\"Test_Static{s}StructProperty\").Handle);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend (class_ptr, new Selector (\"Test_Static{s}StructProperty\").Handle);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 4)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\trvd = 0;");
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend_out_double (obj.Handle, new Selector (\"Test_{s}Struct_out_double:\").Handle, out rvd);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret_out_double (out rv, obj.Handle, new Selector (\"Test_{s}Struct_out_double:\").Handle, out rvd);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend_out_double (obj.Handle, new Selector (\"Test_{s}Struct_out_double:\").Handle, out rvd);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 5)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (3.14, rvd, \"double out\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t\trvf = 0;");
WriteStretConditions (w, s, out never);
if (never) {
w.AppendLine ($"\t\t\t\trv = S{s}_objc_msgSend_out_float (class_ptr, new Selector (\"Test_Static{s}Struct_out_float:\").Handle, out rvf);");
} else {
w.AppendLine ($"\t\t\t\t\tS{s}_objc_msgSend_stret_out_float (out rv, class_ptr, new Selector (\"Test_Static{s}Struct_out_float:\").Handle, out rvf);");
w.AppendLine ($"\t\t\t\t}} else {{");
w.AppendLine ($"\t\t\t\t\trv = S{s}_objc_msgSend_out_float (class_ptr, new Selector (\"Test_Static{s}Struct_out_float:\").Handle, out rvf);");
w.AppendLine ($"\t\t\t\t}}");
}
w.AppendLine ($"\t\t\t\tAssert.AreEqual (({GenerateNewExpression (s, 6)}).ToString (), rv.ToString (), \"a\");");
w.AppendLine ($"\t\t\t\tAssert.AreEqual (3.15f, rvf, \"float out\");");
w.AppendLine ();
w.AppendLine ($"\t\t\t}}");
w.AppendLine ($"\t\t}}");
// objc_msgSend variants
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend\")]");
w.AppendLine ($"\t\textern static S{s} S{s}_objc_msgSend (IntPtr received, IntPtr selector);");
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend\")]");
w.AppendLine ($"\t\textern static S{s} S{s}_objc_msgSend_out_float (IntPtr received, IntPtr selector, out float x1);");
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend\")]");
w.AppendLine ($"\t\textern static S{s} S{s}_objc_msgSend_out_double (IntPtr received, IntPtr selector, out double x1);");
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend_stret\")]");
w.AppendLine ($"\t\textern static void S{s}_objc_msgSend_stret (out S{s} rv, IntPtr received, IntPtr selector);");
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend_stret\")]");
w.AppendLine ($"\t\textern static void S{s}_objc_msgSend_stret_out_float (out S{s} rv, IntPtr received, IntPtr selector, out float x1);");
w.AppendLine ();
w.AppendLine ($"\t\t[DllImport (LIBOBJC_DYLIB, EntryPoint=\"objc_msgSend_stret\")]");
w.AppendLine ($"\t\textern static void S{s}_objc_msgSend_stret_out_double (out S{s} rv, IntPtr received, IntPtr selector, out double x1);");
}
w.AppendLine (@" }
}");
File.WriteAllText ("TrampolineTest.generated.cs", w.ToString ());
}
static void WriteStretConditions (StringBuilder w, string s, out bool never)
{
var stret = strets [Array.IndexOf (structs, s)];
if (stret == Architecture.None) {
never = true;
} else {
never = false;
w.Append ("\t\t\t\tif (");
if ((stret & Architecture.Arm32) == Architecture.Arm32)
w.Append ("TrampolineTest.IsArm32 || ");
if ((stret & Architecture.Armv7k) == Architecture.Armv7k)
w.Append ("TrampolineTest.IsArmv7k || ");
if ((stret & Architecture.X86) == Architecture.X86)
w.Append ("TrampolineTest.IsX86 || ");
if ((stret & Architecture.X64) == Architecture.X64)
w.Append ("TrampolineTest.IsX64 || ");
w.Length -= 4;
w.AppendLine (") {");
}
}
static string GenerateNewExpression (string s, int multiplier = 1)
{
var sb = new StringBuilder ();
sb.Append ($"new S{s} () {{ ");
for (int i = 0; i < s.Length; i++)
sb.Append ("x").Append (i).Append (" = ").Append (GetValue (s [i], i, multiplier)).Append (", ");
sb.Length -= 2;
sb.Append (" }");
return sb.ToString ();
}
static void Main ()
{
while (Path.GetFileName (Environment.CurrentDirectory) != "test-libraries")
Environment.CurrentDirectory = Path.GetDirectoryName (Environment.CurrentDirectory)!;
/* native code */
WriteLibTestStructH ();
WriteLibTestDecompileM ();
WriteLibTestPropertiesH ();
WriteLibTestMethodsH ();
WriteLibTestMethodsM ();
/* binding code */
WriteApiDefinition ();
WriteStructsAndEnums ();
/* tests */
WriteRegistrarTests ();
WriteTrampolineTests ();
Console.WriteLine ("Generated test files");
}
}