|
|
@@ -0,0 +1,993 @@
|
|
|
+using Invercargill;
|
|
|
+using Invercargill.Nullable;
|
|
|
+
|
|
|
+// Test helper class for reference type testing
|
|
|
+private class NativeElementTestObject : Object {
|
|
|
+ public int value { get; set; }
|
|
|
+ public NativeElementTestObject(int value) {
|
|
|
+ this.value = value;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Test helper class implementing Stringifyable
|
|
|
+private class NativeElementTestStringifyable : Object, Stringifyable {
|
|
|
+ public string data { get; set; }
|
|
|
+ public NativeElementTestStringifyable(string data) {
|
|
|
+ this.data = data;
|
|
|
+ }
|
|
|
+ public string to_string() {
|
|
|
+ return @"Stringifyable[$data]";
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void native_element_tests() {
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // NativeElement Construction Tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/int_non_nullable", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/int_nullable_with_value", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/int_nullable_null", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/bool_non_nullable", () => {
|
|
|
+ var elem = new NativeElement<bool>(true);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/bool_nullable_with_value", () => {
|
|
|
+ bool? x = false;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/bool_nullable_null", () => {
|
|
|
+ bool? x = null;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/string_non_nullable", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true); // string is always nullable
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/string_nullable_with_value", () => {
|
|
|
+ string? s = "world";
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/string_nullable_null", () => {
|
|
|
+ string? s = null;
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/object_non_nullable", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true); // Objects are always nullable
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/object_nullable_with_value", () => {
|
|
|
+ NativeElementTestObject? obj = new NativeElementTestObject(99);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject?>(obj);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/construction/object_nullable_null", () => {
|
|
|
+ NativeElementTestObject? obj = null;
|
|
|
+ var elem = new NativeElement<NativeElementTestObject?>(obj);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_reference_type == true);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // type() method tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type/int_returns_int_type", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem.type() == typeof(int));
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type/int_nullable_returns_int_type", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ assert_true(elem.type() == typeof(int?));
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type/string_returns_string_type", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ assert_true(elem.type() == typeof(string));
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type/object_returns_object_type", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem.type() == typeof(NativeElementTestObject));
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // type_name() method tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type_name/int_type_name", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ var name = elem.type_name();
|
|
|
+ assert_true(name != null);
|
|
|
+ assert_true("int" in name || "gint" in name);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type_name/string_type_name", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ var name = elem.type_name();
|
|
|
+ assert_true(name != null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/type_name/object_type_name", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ var name = elem.type_name();
|
|
|
+ assert_true(name != null);
|
|
|
+ assert_true("NativeElementTestObject" in name);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // is_type() method tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_type/int_is_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem.is_type(typeof(int)) == true);
|
|
|
+ assert_true(elem.is_type(typeof(string)) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_type/object_is_correct_type", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem.is_type(typeof(NativeElementTestObject)) == true);
|
|
|
+ assert_true(elem.is_type(typeof(Object)) == true); // Inheritance
|
|
|
+ assert_true(elem.is_type(typeof(string)) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // assignable_to_type() tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assignable_to_type/int_assignable_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem.assignable_to_type(typeof(int)) == true);
|
|
|
+ assert_true(elem.assignable_to_type(typeof(string)) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assignable_to_type/object_assignable_to_object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem.assignable_to_type(typeof(NativeElementTestObject)) == true);
|
|
|
+ assert_true(elem.assignable_to_type(typeof(Object)) == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // assignable_to<T>() tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assignable_to/int_assignable_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem.assignable_to<int>() == true);
|
|
|
+ assert_true(elem.assignable_to<string>() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assignable_to/object_assignable_to_object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem.assignable_to<NativeElementTestObject>() == true);
|
|
|
+ assert_true(elem.assignable_to<Object>() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // @is<T>() tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is/int_is_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem.is<int>() == true);
|
|
|
+ assert_true(elem.is<string>() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is/object_is_correct_type", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ assert_true(elem.is<NativeElementTestObject>() == true);
|
|
|
+ assert_true(elem.is<Object>() == true);
|
|
|
+ assert_true(elem.is<string>() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // try_get_as<T>() tests - non-nullable value types
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_to_int_zero", () => {
|
|
|
+ var elem = new NativeElement<int>(0);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == 0);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_to_int_negative", () => {
|
|
|
+ var elem = new NativeElement<int>(-42);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == -42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_to_bool_true", () => {
|
|
|
+ var elem = new NativeElement<bool>(true);
|
|
|
+ bool result;
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == true);
|
|
|
+ assert_true(result == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_to_bool_false", () => {
|
|
|
+ var elem = new NativeElement<bool>(false);
|
|
|
+ bool result;
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == true);
|
|
|
+ assert_true(result == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/long_to_long", () => {
|
|
|
+ var elem = new NativeElement<long>(123456789L);
|
|
|
+ long result;
|
|
|
+ assert_true(elem.try_get_as<long>(out result) == true);
|
|
|
+ assert_true(result == 123456789L);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // try_get_as<T>() tests - nullable value types with values
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_nullable_to_int", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_nullable_to_int_nullable", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_nullable_to_bool", () => {
|
|
|
+ bool? x = true;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool result;
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == true);
|
|
|
+ assert_true(result == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_nullable_to_bool_nullable", () => {
|
|
|
+ bool? x = false;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool? result;
|
|
|
+ assert_true(elem.try_get_as<bool?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // try_get_as<T>() tests - nullable value types with null
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_nullable_null_to_int_fails", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int result;
|
|
|
+ // Should fail because null cannot be converted to non-nullable int
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_nullable_null_to_int_nullable", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_nullable_null_to_bool_fails", () => {
|
|
|
+ bool? x = null;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool result;
|
|
|
+ // Should fail because null cannot be converted to non-nullable bool
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/bool_nullable_null_to_bool_nullable", () => {
|
|
|
+ bool? x = null;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool? result;
|
|
|
+ assert_true(elem.try_get_as<bool?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // try_get_as<T>() tests - reference types
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/string_to_string", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ string result;
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == true);
|
|
|
+ assert_true(result == "hello");
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/string_nullable_to_string", () => {
|
|
|
+ string? s = "world";
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ string result;
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == true);
|
|
|
+ assert_true(result == "world");
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/string_nullable_null_to_string_succeeds", () => {
|
|
|
+ string? s = null;
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ string result;
|
|
|
+ // For reference types, convert_nullability returns TRUE even for null
|
|
|
+ // because no conversion is needed - the reference is just passed through
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/object_to_object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ NativeElementTestObject result;
|
|
|
+ assert_true(elem.try_get_as<NativeElementTestObject>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result.value == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/object_nullable_to_object", () => {
|
|
|
+ NativeElementTestObject? obj = new NativeElementTestObject(99);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject?>(obj);
|
|
|
+ NativeElementTestObject result;
|
|
|
+ assert_true(elem.try_get_as<NativeElementTestObject>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result.value == 99);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/object_nullable_null_to_object_succeeds", () => {
|
|
|
+ NativeElementTestObject? obj = null;
|
|
|
+ var elem = new NativeElement<NativeElementTestObject?>(obj);
|
|
|
+ NativeElementTestObject result;
|
|
|
+ // For reference types, convert_nullability returns TRUE even for null
|
|
|
+ // because no conversion is needed - the reference is just passed through
|
|
|
+ assert_true(elem.try_get_as<NativeElementTestObject>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/object_nullable_null_to_object_nullable", () => {
|
|
|
+ NativeElementTestObject? obj = null;
|
|
|
+ var elem = new NativeElement<NativeElementTestObject?>(obj);
|
|
|
+ NativeElementTestObject? result;
|
|
|
+ assert_true(elem.try_get_as<NativeElementTestObject?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // try_get_as<T>() tests - type conversion failures
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/int_to_string_fails", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ string result;
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/string_to_int_fails", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/try_get_as/object_to_wrong_type_fails", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ string result;
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // @as<T>() tests - successful conversions
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/as/int_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ try {
|
|
|
+ var result = elem.as<int>();
|
|
|
+ assert_true(result == 42);
|
|
|
+ } catch (Error e) {
|
|
|
+ assert_not_reached();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/as/string_to_string", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ try {
|
|
|
+ var result = elem.as<string>();
|
|
|
+ assert_true(result == "hello");
|
|
|
+ } catch (Error e) {
|
|
|
+ assert_not_reached();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/as/object_to_object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ try {
|
|
|
+ var result = elem.as<NativeElementTestObject>();
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result.value == 42);
|
|
|
+ } catch (Error e) {
|
|
|
+ assert_not_reached();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // @as<T>() tests - failed conversions (should throw)
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/as/int_to_string_throws", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ try {
|
|
|
+ var result = elem.as<string>();
|
|
|
+ assert_not_reached(); // Should have thrown
|
|
|
+ } catch (ElementError e) {
|
|
|
+ // Expected
|
|
|
+ } catch (Error e) {
|
|
|
+ assert_not_reached();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/as/string_to_int_throws", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ try {
|
|
|
+ var result = elem.as<int>();
|
|
|
+ assert_not_reached(); // Should have thrown
|
|
|
+ } catch (ElementError e) {
|
|
|
+ // Expected
|
|
|
+ } catch (Error e) {
|
|
|
+ assert_not_reached();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // assert_as<T>() tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assert_as/int_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ var result = elem.assert_as<int>();
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assert_as/string_to_string", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ var result = elem.assert_as<string>();
|
|
|
+ assert_true(result == "hello");
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/assert_as/object_to_object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ var result = elem.assert_as<NativeElementTestObject>();
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result.value == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ // Note: assert_as<T>() with wrong type will critical and abort,
|
|
|
+ // so we don't test failure cases here as they would crash the test suite
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // to_string() tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/to_string/int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ var str = elem.to_string();
|
|
|
+ assert_true(str != null);
|
|
|
+ assert_true("NativeElement" in str);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/to_string/string", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ var str = elem.to_string();
|
|
|
+ assert_true(str != null);
|
|
|
+ assert_true("NativeElement" in str);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/to_string/object", () => {
|
|
|
+ var obj = new NativeElementTestObject(42);
|
|
|
+ var elem = new NativeElement<NativeElementTestObject>(obj);
|
|
|
+ var str = elem.to_string();
|
|
|
+ assert_true(str != null);
|
|
|
+ assert_true("NativeElement" in str);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // Nullability conversion tests (matching Nullable.vala tests)
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/int_to_int_nullable", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/int_nullable_to_int_with_value", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/int_nullable_to_int_null", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int result;
|
|
|
+ // Should fail because null cannot be converted to non-nullable
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/int_nullable_to_int_nullable_with_value", () => {
|
|
|
+ int? x = 42;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/int_nullable_to_int_nullable_null", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/bool_to_bool_nullable", () => {
|
|
|
+ var elem = new NativeElement<bool>(true);
|
|
|
+ bool? result;
|
|
|
+ assert_true(elem.try_get_as<bool?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/bool_nullable_to_bool_with_value", () => {
|
|
|
+ bool? x = true;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool result;
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == true);
|
|
|
+ assert_true(result == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/bool_nullable_to_bool_null", () => {
|
|
|
+ bool? x = null;
|
|
|
+ var elem = new NativeElement<bool?>(x);
|
|
|
+ bool result;
|
|
|
+ // Should fail because null cannot be converted to non-nullable
|
|
|
+ assert_true(elem.try_get_as<bool>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/long_to_long_nullable", () => {
|
|
|
+ var elem = new NativeElement<long>(123456789L);
|
|
|
+ long? result;
|
|
|
+ assert_true(elem.try_get_as<long?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 123456789L);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/long_nullable_to_long_with_value", () => {
|
|
|
+ long? x = 123456789L;
|
|
|
+ var elem = new NativeElement<long?>(x);
|
|
|
+ long result;
|
|
|
+ assert_true(elem.try_get_as<long>(out result) == true);
|
|
|
+ assert_true(result == 123456789L);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/nullability/long_nullable_to_long_null", () => {
|
|
|
+ long? x = null;
|
|
|
+ var elem = new NativeElement<long?>(x);
|
|
|
+ long result;
|
|
|
+ // Should fail because null cannot be converted to non-nullable
|
|
|
+ assert_true(elem.try_get_as<long>(out result) == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // Edge cases and boundary values
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/int_min_value", () => {
|
|
|
+ var elem = new NativeElement<int>(int.MIN);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == int.MIN);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/int_max_value", () => {
|
|
|
+ var elem = new NativeElement<int>(int.MAX);
|
|
|
+ int result;
|
|
|
+ assert_true(elem.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == int.MAX);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/long_min_value", () => {
|
|
|
+ var elem = new NativeElement<long>(long.MIN);
|
|
|
+ long result;
|
|
|
+ assert_true(elem.try_get_as<long>(out result) == true);
|
|
|
+ assert_true(result == long.MIN);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/long_max_value", () => {
|
|
|
+ var elem = new NativeElement<long>(long.MAX);
|
|
|
+ long result;
|
|
|
+ assert_true(elem.try_get_as<long>(out result) == true);
|
|
|
+ assert_true(result == long.MAX);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/empty_string", () => {
|
|
|
+ var elem = new NativeElement<string>("");
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ string result;
|
|
|
+ assert_true(elem.try_get_as<string>(out result) == true);
|
|
|
+ assert_true(result == "");
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/edge/string_nullable_empty", () => {
|
|
|
+ string? s = "";
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ string? result;
|
|
|
+ assert_true(elem.try_get_as<string?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == "");
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // Sequence tests (multiple conversions)
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/sequence/int_to_nullable_to_int", () => {
|
|
|
+ var elem = new NativeElement<int>(42);
|
|
|
+
|
|
|
+ // First conversion: int -> int?
|
|
|
+ int? temp;
|
|
|
+ assert_true(elem.try_get_as<int?>(out temp) == true);
|
|
|
+ assert_true(temp != null);
|
|
|
+ assert_true(temp == 42);
|
|
|
+
|
|
|
+ // Create new element from nullable
|
|
|
+ var elem2 = new NativeElement<int?>(temp);
|
|
|
+
|
|
|
+ // Second conversion: int? -> int
|
|
|
+ int result;
|
|
|
+ assert_true(elem2.try_get_as<int>(out result) == true);
|
|
|
+ assert_true(result == 42);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/sequence/null_nullable_to_int_to_nullable", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+
|
|
|
+ // First conversion: int? (null) -> int (should fail)
|
|
|
+ int temp;
|
|
|
+ assert_true(elem.try_get_as<int>(out temp) == false);
|
|
|
+
|
|
|
+ // Second conversion: int? (null) -> int? (null)
|
|
|
+ int? result;
|
|
|
+ assert_true(elem.try_get_as<int?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // Interface implementation tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/interface/implements_element", () => {
|
|
|
+ Element elem = new NativeElement<int>(42);
|
|
|
+ assert_true(elem != null);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ assert_true(elem.type() == typeof(int));
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/interface/polymorphic_usage", () => {
|
|
|
+ Element e1 = new NativeElement<int>(42);
|
|
|
+ Element e2 = new NativeElement<string>("hello");
|
|
|
+ Element e3 = new NativeElement<NativeElementTestObject>(new NativeElementTestObject(99));
|
|
|
+
|
|
|
+ assert_true(e1.type() == typeof(int));
|
|
|
+ assert_true(e2.type() == typeof(string));
|
|
|
+ assert_true(e3.type() == typeof(NativeElementTestObject));
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // is_null() consistency tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_null/non_nullable_never_null", () => {
|
|
|
+ var elem = new NativeElement<int>(0);
|
|
|
+ // Non-nullable types should never report as null
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_null/nullable_with_value_not_null", () => {
|
|
|
+ int? x = 0;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_null/nullable_null_is_null", () => {
|
|
|
+ int? x = null;
|
|
|
+ var elem = new NativeElement<int?>(x);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_null/string_not_null", () => {
|
|
|
+ var elem = new NativeElement<string>("hello");
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_null/string_null_is_null", () => {
|
|
|
+ string? s = null;
|
|
|
+ var elem = new NativeElement<string?>(s);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // is_reference_type consistency tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_reference_type/value_types_not_reference", () => {
|
|
|
+ var elem_int = new NativeElement<int>(42);
|
|
|
+ var elem_bool = new NativeElement<bool>(true);
|
|
|
+ var elem_long = new NativeElement<long>(123L);
|
|
|
+
|
|
|
+ assert_true(elem_int.is_reference_type == false);
|
|
|
+ assert_true(elem_bool.is_reference_type == false);
|
|
|
+ assert_true(elem_long.is_reference_type == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_reference_type/reference_types_are_reference", () => {
|
|
|
+ var elem_str = new NativeElement<string>("hello");
|
|
|
+ var elem_obj = new NativeElement<NativeElementTestObject>(new NativeElementTestObject(42));
|
|
|
+
|
|
|
+ assert_true(elem_str.is_reference_type == true);
|
|
|
+ assert_true(elem_obj.is_reference_type == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // is_nullable property consistency tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_nullable/non_nullable_value_types", () => {
|
|
|
+ var elem_int = new NativeElement<int>(42);
|
|
|
+ var elem_bool = new NativeElement<bool>(true);
|
|
|
+ var elem_long = new NativeElement<long>(123L);
|
|
|
+
|
|
|
+ assert_true(elem_int.is_nullable == false);
|
|
|
+ assert_true(elem_bool.is_nullable == false);
|
|
|
+ assert_true(elem_long.is_nullable == false);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_nullable/nullable_value_types", () => {
|
|
|
+ int? xi = 42;
|
|
|
+ bool? xb = true;
|
|
|
+ long? xl = 123L;
|
|
|
+
|
|
|
+ var elem_int = new NativeElement<int?>(xi);
|
|
|
+ var elem_bool = new NativeElement<bool?>(xb);
|
|
|
+ var elem_long = new NativeElement<long?>(xl);
|
|
|
+
|
|
|
+ assert_true(elem_int.is_nullable == true);
|
|
|
+ assert_true(elem_bool.is_nullable == true);
|
|
|
+ assert_true(elem_long.is_nullable == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/is_nullable/reference_types_always_nullable", () => {
|
|
|
+ var elem_str = new NativeElement<string>("hello");
|
|
|
+ var elem_obj = new NativeElement<NativeElementTestObject>(new NativeElementTestObject(42));
|
|
|
+
|
|
|
+ // Reference types are always nullable
|
|
|
+ assert_true(elem_str.is_nullable == true);
|
|
|
+ assert_true(elem_obj.is_nullable == true);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // char and uchar tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/char/non_nullable", () => {
|
|
|
+ var elem = new NativeElement<char>('a');
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+
|
|
|
+ char result;
|
|
|
+ assert_true(elem.try_get_as<char>(out result) == true);
|
|
|
+ assert_true(result == 'a');
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/char/nullable_with_value", () => {
|
|
|
+ char? c = 'z';
|
|
|
+ var elem = new NativeElement<char?>(c);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+
|
|
|
+ char? result;
|
|
|
+ assert_true(elem.try_get_as<char?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 'z');
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/char/nullable_null", () => {
|
|
|
+ char? c = null;
|
|
|
+ var elem = new NativeElement<char?>(c);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+
|
|
|
+ char? result;
|
|
|
+ assert_true(elem.try_get_as<char?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/uchar/non_nullable", () => {
|
|
|
+ var elem = new NativeElement<uchar>(255);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+
|
|
|
+ uchar result;
|
|
|
+ assert_true(elem.try_get_as<uchar>(out result) == true);
|
|
|
+ assert_true(result == 255);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/uchar/nullable_with_value", () => {
|
|
|
+ uchar? c = 128;
|
|
|
+ var elem = new NativeElement<uchar?>(c);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == false);
|
|
|
+
|
|
|
+ uchar? result;
|
|
|
+ assert_true(elem.try_get_as<uchar?>(out result) == true);
|
|
|
+ assert_true(result != null);
|
|
|
+ assert_true(result == 128);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/uchar/nullable_null", () => {
|
|
|
+ uchar? c = null;
|
|
|
+ var elem = new NativeElement<uchar?>(c);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+ assert_true(elem.is_null() == true);
|
|
|
+
|
|
|
+ uchar? result;
|
|
|
+ assert_true(elem.try_get_as<uchar?>(out result) == true);
|
|
|
+ assert_true(result == null);
|
|
|
+ });
|
|
|
+
|
|
|
+ // ============================================================================
|
|
|
+ // uint and ulong tests
|
|
|
+ // ============================================================================
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/uint/non_nullable", () => {
|
|
|
+ var elem = new NativeElement<uint>(42u);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+
|
|
|
+ uint result;
|
|
|
+ assert_true(elem.try_get_as<uint>(out result) == true);
|
|
|
+ assert_true(result == 42u);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/uint/nullable_with_value", () => {
|
|
|
+ uint? x = 99u;
|
|
|
+ var elem = new NativeElement<uint?>(x);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+
|
|
|
+ uint? result;
|
|
|
+ assert_true(elem.try_get_as<uint?>(out result) == true);
|
|
|
+ assert_true(result == 99u);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/ulong/non_nullable", () => {
|
|
|
+ var elem = new NativeElement<ulong>(123456789UL);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == false);
|
|
|
+
|
|
|
+ ulong result;
|
|
|
+ assert_true(elem.try_get_as<ulong>(out result) == true);
|
|
|
+ assert_true(result == 123456789UL);
|
|
|
+ });
|
|
|
+
|
|
|
+ Test.add_func("/invercargill/native_element/ulong/nullable_with_value", () => {
|
|
|
+ ulong? x = 123456789UL;
|
|
|
+ var elem = new NativeElement<ulong?>(x);
|
|
|
+ assert_true(elem.is_reference_type == false);
|
|
|
+ assert_true(elem.is_nullable == true);
|
|
|
+
|
|
|
+ ulong? result;
|
|
|
+ assert_true(elem.try_get_as<ulong?>(out result) == true);
|
|
|
+ assert_true(result == 123456789UL);
|
|
|
+ });
|
|
|
+}
|