mirror of
https://github.com/Ryujinx/GtkSharp.git
synced 2024-12-27 03:15:57 +00:00
196be89bc9
constructors and casts. Add a new Enum cast. (Val): Handle Pointer values. Change the handling of Enum/Flags values to return the value directly rather than returning an EnumWrapper. Remove the Char (ie, "byte") handling since there aren't any char properties in all of gtk-sharp and the generator mistakenly converts them to strings anyway. * glib/EnumWrapper.cs: * glib/UnwrappedObject.cs: Mark these Obsolete. * glib/glue/type.c (gtksharp_get_parent_type, gtksharp_get_type_name_for_id): * glib/glue/value.c (gtksharp_value_get_value_type): Remove some unneeded glue methods. * generator/Ctor.cs (Generate): * generator/Property.cs (Generate): Simplify the enum and object property glue to not use EnumWrapper or UnwrappedObject. * sample/valtest/*: a regression test for GLib.Value * configure.in.in: add sample/valtest svn path=/trunk/gtk-sharp/; revision=47564
350 lines
10 KiB
C#
350 lines
10 KiB
C#
// Valtest.cs: GLib.Value regression test
|
|
//
|
|
// Copyright (c) 2005 Novell, Inc.
|
|
|
|
using Gtksharp;
|
|
using System;
|
|
|
|
public class Valtest {
|
|
|
|
static int errors = 0;
|
|
|
|
const bool BOOL_VAL = true;
|
|
const int INT_VAL = -73523;
|
|
const uint UINT_VAL = 99999U;
|
|
const long INT64_VAL = -5000000000;
|
|
const ulong UINT64_VAL = 5000000000U;
|
|
const char UNICHAR_VAL = '\x20AC'; // euro
|
|
const Gtk.ArrowType ENUM_VAL = Gtk.ArrowType.Left;
|
|
const Gtk.AttachOptions FLAGS_VAL = Gtk.AttachOptions.Expand | Gtk.AttachOptions.Fill;
|
|
const float FLOAT_VAL = 1.5f;
|
|
const double DOUBLE_VAL = Math.PI;
|
|
const string STRING_VAL = "This is a test";
|
|
static Gdk.Rectangle BOXED_VAL;
|
|
static IntPtr POINTER_VAL;
|
|
static Gtk.Widget OBJECT_VAL;
|
|
|
|
public static int Main ()
|
|
{
|
|
Gtk.Application.Init ();
|
|
|
|
BOXED_VAL = new Gdk.Rectangle (1, 2, 3, 4);
|
|
POINTER_VAL = (IntPtr) System.Runtime.InteropServices.GCHandle.Alloc ("foo");
|
|
OBJECT_VAL = new Gtk.DrawingArea ();
|
|
|
|
// Part 1: Make sure values of all types round-trip correctly within Gtk#
|
|
GLib.Value val;
|
|
|
|
try {
|
|
val = new GLib.Value (BOOL_VAL);
|
|
if ((bool)val != BOOL_VAL)
|
|
CVError ("boolean cast", BOOL_VAL, (bool)val, val.Val);
|
|
if ((bool)val.Val != BOOL_VAL)
|
|
CVError ("boolean Val", BOOL_VAL, (bool)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("boolean", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (INT_VAL);
|
|
if ((int)val != INT_VAL)
|
|
CVError ("int cast", INT_VAL, (int)val, val.Val);
|
|
if ((int)val.Val != INT_VAL)
|
|
CVError ("int Val", INT_VAL, (int)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("int", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (UINT_VAL);
|
|
if ((uint)val != UINT_VAL)
|
|
CVError ("uint cast", UINT_VAL, (uint)val, val.Val);
|
|
if ((uint)val.Val != UINT_VAL)
|
|
CVError ("uint Val", UINT_VAL, (uint)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("uint", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (INT64_VAL);
|
|
if ((long)val != INT64_VAL)
|
|
CVError ("int64 cast", INT64_VAL, (long)val, val.Val);
|
|
if ((long)val.Val != INT64_VAL)
|
|
CVError ("int64 Val", INT64_VAL, (long)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("int64", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (UINT64_VAL);
|
|
if ((ulong)val != UINT64_VAL)
|
|
CVError ("uint64 cast", UINT64_VAL, (ulong)val, val.Val);
|
|
if ((ulong)val.Val != UINT64_VAL)
|
|
CVError ("uint64 Val", UINT64_VAL, (ulong)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("uint64", e);
|
|
}
|
|
|
|
// gunichar doesn't have its own GValue type, it shares with guint
|
|
|
|
try {
|
|
val = new GLib.Value (ENUM_VAL);
|
|
if ((Gtk.ArrowType)val != ENUM_VAL)
|
|
CVError ("enum cast", ENUM_VAL, (Gtk.ArrowType)val, val.Val);
|
|
if ((Gtk.ArrowType)val.Val != ENUM_VAL)
|
|
CVError ("enum Val", ENUM_VAL, (Gtk.ArrowType)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("enum", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (FLAGS_VAL);
|
|
if ((Gtk.AttachOptions)val != FLAGS_VAL)
|
|
CVError ("flags cast", FLAGS_VAL, (Gtk.AttachOptions)val, val.Val);
|
|
if ((Gtk.AttachOptions)val.Val != FLAGS_VAL)
|
|
CVError ("flags Val", FLAGS_VAL, (Gtk.AttachOptions)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("flags", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (FLOAT_VAL);
|
|
if ((float)val != FLOAT_VAL)
|
|
CVError ("float cast", FLOAT_VAL, (float)val, val.Val);
|
|
if ((float)val.Val != FLOAT_VAL)
|
|
CVError ("float Val", FLOAT_VAL, (float)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("float", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (DOUBLE_VAL);
|
|
if ((double)val != DOUBLE_VAL)
|
|
CVError ("double cast", DOUBLE_VAL, (double)val, val.Val);
|
|
if ((double)val.Val != DOUBLE_VAL)
|
|
CVError ("double Val", DOUBLE_VAL, (double)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("double", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (STRING_VAL);
|
|
if ((string)val != STRING_VAL)
|
|
CVError ("string cast", STRING_VAL, (string)val, val.Val);
|
|
if ((string)val.Val != STRING_VAL)
|
|
CVError ("string Val", STRING_VAL, (string)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("string", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (BOXED_VAL);
|
|
if ((Gdk.Rectangle)val != BOXED_VAL)
|
|
CVError ("boxed cast", BOXED_VAL, (Gdk.Rectangle)val, val.Val);
|
|
// Can't currently use .Val on boxed types
|
|
} catch (Exception e) {
|
|
ExceptionError ("boxed", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (POINTER_VAL);
|
|
if ((IntPtr)val != POINTER_VAL)
|
|
CVError ("pointer cast", POINTER_VAL, (IntPtr)val, val.Val);
|
|
if ((IntPtr)val.Val != POINTER_VAL)
|
|
CVError ("pointer Val", POINTER_VAL, (IntPtr)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("pointer", e);
|
|
}
|
|
|
|
try {
|
|
val = new GLib.Value (OBJECT_VAL);
|
|
if ((Gtk.DrawingArea)val != OBJECT_VAL)
|
|
CVError ("object cast", OBJECT_VAL, (Gtk.DrawingArea)val, val.Val);
|
|
if ((Gtk.DrawingArea)val.Val != OBJECT_VAL)
|
|
CVError ("object Val", OBJECT_VAL, (Gtk.DrawingArea)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("object", e);
|
|
}
|
|
|
|
// Test ManagedValue
|
|
|
|
Structtest st = new Structtest (5, "foo");
|
|
try {
|
|
val = new GLib.Value (st);
|
|
// No direct GLib.Value -> ManagedValue cast
|
|
Structtest st2 = (Structtest)val.Val;
|
|
if (st.Int != st2.Int || st.String != st2.String)
|
|
CVError ("ManagedValue Val", st, (Gtk.DrawingArea)val, val.Val);
|
|
} catch (Exception e) {
|
|
ExceptionError ("ManagedValue", e);
|
|
}
|
|
|
|
// Part 2: method->unmanaged->property round trip
|
|
Valobj vo;
|
|
vo = new Valobj ();
|
|
|
|
vo.Boolean = BOOL_VAL;
|
|
if (vo.BooleanProp != BOOL_VAL)
|
|
MPError ("boolean method->prop", BOOL_VAL, vo.Boolean, vo.BooleanProp);
|
|
|
|
vo.Int = INT_VAL;
|
|
if (vo.IntProp != INT_VAL)
|
|
MPError ("int method->prop", INT_VAL, vo.Int, vo.IntProp);
|
|
|
|
vo.Uint = UINT_VAL;
|
|
if (vo.UintProp != UINT_VAL)
|
|
MPError ("uint method->prop", UINT_VAL, vo.Uint, vo.UintProp);
|
|
|
|
vo.Int64 = INT64_VAL;
|
|
if (vo.Int64Prop != INT64_VAL)
|
|
MPError ("int64 method->prop", INT64_VAL, vo.Int64, vo.Int64Prop);
|
|
|
|
vo.Uint64 = UINT64_VAL;
|
|
if (vo.Uint64Prop != UINT64_VAL)
|
|
MPError ("uint64 method->prop", UINT64_VAL, vo.Uint64, vo.Uint64Prop);
|
|
|
|
vo.Unichar = UNICHAR_VAL;
|
|
if (vo.UnicharProp != UNICHAR_VAL)
|
|
MPError ("unichar method->prop", UNICHAR_VAL, vo.Unichar, vo.UnicharProp);
|
|
|
|
vo.Enum = ENUM_VAL;
|
|
if (vo.EnumProp != ENUM_VAL)
|
|
MPError ("enum method->prop", ENUM_VAL, vo.Enum, vo.EnumProp);
|
|
|
|
vo.Flags = FLAGS_VAL;
|
|
if (vo.FlagsProp != (FLAGS_VAL))
|
|
MPError ("flags method->prop", FLAGS_VAL, vo.Flags, vo.FlagsProp);
|
|
|
|
vo.Float = FLOAT_VAL;
|
|
if (vo.FloatProp != FLOAT_VAL)
|
|
MPError ("float method->prop", FLOAT_VAL, vo.Float, vo.FloatProp);
|
|
|
|
vo.Double = DOUBLE_VAL;
|
|
if (vo.DoubleProp != DOUBLE_VAL)
|
|
MPError ("double method->prop", DOUBLE_VAL, vo.Double, vo.DoubleProp);
|
|
|
|
vo.String = STRING_VAL;
|
|
if (vo.StringProp != STRING_VAL)
|
|
MPError ("string method->prop", STRING_VAL, vo.String, vo.StringProp);
|
|
|
|
vo.Boxed = BOXED_VAL;
|
|
if (vo.BoxedProp != BOXED_VAL)
|
|
MPError ("boxed method->prop", BOXED_VAL, vo.Boxed, vo.BoxedProp);
|
|
|
|
vo.Pointer = POINTER_VAL;
|
|
if (vo.PointerProp != POINTER_VAL)
|
|
MPError ("pointer method->prop", POINTER_VAL, vo.Pointer, vo.PointerProp);
|
|
|
|
vo.Object = OBJECT_VAL;
|
|
if (vo.ObjectProp != OBJECT_VAL) {
|
|
MPError ("object method->prop", OBJECT_VAL.GetType().Name + " " + OBJECT_VAL.GetHashCode (),
|
|
vo.Object == null ? "null" : vo.Object.GetType().Name + " " + vo.Object.GetHashCode (),
|
|
vo.ObjectProp == null ? "null" : vo.ObjectProp.GetType().Name + " " + vo.ObjectProp.GetHashCode ());
|
|
}
|
|
|
|
|
|
// Part 3: property->unmanaged->method round trip
|
|
vo = new Valobj ();
|
|
|
|
vo.BooleanProp = BOOL_VAL;
|
|
if (vo.Boolean != BOOL_VAL)
|
|
MPError ("boolean prop->method", BOOL_VAL, vo.Boolean, vo.BooleanProp);
|
|
|
|
vo.IntProp = INT_VAL;
|
|
if (vo.Int != INT_VAL)
|
|
MPError ("int prop->method", INT_VAL, vo.Int, vo.IntProp);
|
|
|
|
vo.UintProp = UINT_VAL;
|
|
if (vo.Uint != UINT_VAL)
|
|
MPError ("uint prop->method", UINT_VAL, vo.Uint, vo.UintProp);
|
|
|
|
vo.Int64Prop = INT64_VAL;
|
|
if (vo.Int64 != INT64_VAL)
|
|
MPError ("int64 prop->method", INT64_VAL, vo.Int64, vo.Int64Prop);
|
|
|
|
vo.Uint64Prop = UINT64_VAL;
|
|
if (vo.Uint64 != UINT64_VAL)
|
|
MPError ("uint64 prop->method", UINT64_VAL, vo.Uint64, vo.Uint64Prop);
|
|
|
|
vo.UnicharProp = UNICHAR_VAL;
|
|
if (vo.Unichar != UNICHAR_VAL)
|
|
MPError ("unichar prop->method", UNICHAR_VAL, vo.Unichar, vo.UnicharProp);
|
|
|
|
vo.EnumProp = ENUM_VAL;
|
|
if (vo.Enum != ENUM_VAL)
|
|
MPError ("enum prop->method", ENUM_VAL, vo.Enum, vo.EnumProp);
|
|
|
|
vo.FlagsProp = FLAGS_VAL;
|
|
if (vo.Flags != (FLAGS_VAL))
|
|
MPError ("flags prop->method", FLAGS_VAL, vo.Flags, vo.FlagsProp);
|
|
|
|
vo.FloatProp = FLOAT_VAL;
|
|
if (vo.Float != FLOAT_VAL)
|
|
MPError ("float prop->method", FLOAT_VAL, vo.Float, vo.FloatProp);
|
|
|
|
vo.DoubleProp = DOUBLE_VAL;
|
|
if (vo.Double != DOUBLE_VAL)
|
|
MPError ("double prop->method", DOUBLE_VAL, vo.Double, vo.DoubleProp);
|
|
|
|
vo.StringProp = STRING_VAL;
|
|
if (vo.String != STRING_VAL)
|
|
MPError ("string prop->method", STRING_VAL, vo.String, vo.StringProp);
|
|
|
|
vo.BoxedProp = BOXED_VAL;
|
|
if (vo.Boxed != BOXED_VAL)
|
|
MPError ("boxed prop->method", BOXED_VAL, vo.Boxed, vo.BoxedProp);
|
|
|
|
vo.PointerProp = POINTER_VAL;
|
|
if (vo.Pointer != POINTER_VAL)
|
|
MPError ("pointer prop->method", POINTER_VAL, vo.Pointer, vo.PointerProp);
|
|
|
|
vo.ObjectProp = OBJECT_VAL;
|
|
if (vo.Object != OBJECT_VAL) {
|
|
MPError ("object prop->method", OBJECT_VAL.GetType().Name + " " + OBJECT_VAL.GetHashCode (),
|
|
vo.Object == null ? "null" : vo.Object.GetType().Name + " " + vo.Object.GetHashCode (),
|
|
vo.ObjectProp == null ? "null" : vo.ObjectProp.GetType().Name + " " + vo.ObjectProp.GetHashCode ());
|
|
}
|
|
|
|
Console.WriteLine ("{0} errors", errors);
|
|
|
|
return errors;
|
|
}
|
|
|
|
static void CVError (string test, object expected, object cast, object value)
|
|
{
|
|
Console.Error.WriteLine ("Failed test {0}. Expected '{1}', got '{2}' from cast, '{3}' from Value",
|
|
test, expected, cast, value);
|
|
errors++;
|
|
}
|
|
|
|
static void ExceptionError (string test, Exception e)
|
|
{
|
|
Console.Error.WriteLine ("Exception in test {0}: {1}",
|
|
test, e.Message);
|
|
errors++;
|
|
}
|
|
|
|
static void MPError (string test, object expected, object method, object prop)
|
|
{
|
|
Console.Error.WriteLine ("Failed test {0}. Expected '{1}', got '{2}' from method, '{3}' from prop",
|
|
test, expected, method, prop);
|
|
errors++;
|
|
}
|
|
}
|
|
|
|
public struct Structtest {
|
|
public int Int;
|
|
public string String;
|
|
|
|
public Structtest (int Int, string String)
|
|
{
|
|
this.Int = Int;
|
|
this.String = String;
|
|
}
|
|
|
|
public override string ToString ()
|
|
{
|
|
return Int.ToString () + "/" + String.ToString ();
|
|
}
|
|
}
|