[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: GParamSpec further funcs



Torsten Schoenfeld <kaffeetisch gmx de> writes:
>
> It needs more work to cope with unichar values (at least).

Oh, just in the tests though.  I see it wants integer values through
gperl_value_from_sv().  New one below.

If integers are the right thing it's a little inconsistent with
get_default_value() returning a string.  Not much fun if you thought to
do a generic

    $pspec->values_cmp ($somevalue, $pspec->get_default_value())

to compare against the default say.  Hmm.  Is there an example
program/module working with a unichar param to have a look at?

--- GParamSpec.xs	19 Aug 2008 09:34:28 +1000	1.25
+++ GParamSpec.xs	23 Aug 2008 11:26:12 +1000	
@@ -625,6 +625,26 @@
 	RETVAL
 
 
+MODULE = Glib::ParamSpec	PACKAGE = Glib::ParamSpec	PREFIX = g_param_
+
+int
+g_param_values_cmp (GParamSpec * pspec, SV *value1, SV *value2)
+    PREINIT:
+	GValue v1 = { 0, };
+	GValue v2 = { 0, };
+	GType type;
+    CODE:
+	type = G_PARAM_SPEC_VALUE_TYPE (pspec);
+	g_value_init (&v1, type);
+	g_value_init (&v2, type);
+	gperl_value_from_sv (&v1, value1);
+	gperl_value_from_sv (&v2, value2);
+	RETVAL = g_param_values_cmp (pspec, &v1, &v2);
+	g_value_unset (&v1);
+	g_value_unset (&v2);
+    OUTPUT:
+	RETVAL
+
 MODULE = Glib::ParamSpec	PACKAGE = Glib::Param::Char
 
  ## actually for all signed integer types
--- e.t	19 Aug 2008 09:04:49 +1000	1.3
+++ e.t	23 Aug 2008 11:16:01 +1000	
@@ -4,7 +4,7 @@
 #
 use strict;
 use Glib ':constants';
-use Test::More tests => 232;
+use Test::More tests => 279;
 
 # first register some types with which to play below.
 
@@ -60,6 +60,11 @@
 	                           TRUE, 'readable');
 pspec_common_ok ($pspec, 'Boolean', 'readable');
 ok ($pspec->get_default_value, "Boolean default (expect TRUE)");
+is ($pspec->values_cmp(0,1), -1);
+is ($pspec->values_cmp(1,0), 1);
+is ($pspec->values_cmp(1,1), 0);
+is ($pspec->values_cmp(123,456), 0);
+is ($pspec->values_cmp('',''), 0);
 
 push @params, $pspec;
 
@@ -82,6 +87,9 @@
 	is ($pspec->get_minimum, $min, "$nick min");
 	is ($pspec->get_maximum, $max, "$nick max");
 	is ($pspec->get_default_value, $default, "$nick default");
+	is ($pspec->values_cmp(22,33), -1);
+	is ($pspec->values_cmp(33,22), 1);
+	is ($pspec->values_cmp(22,22), 0);
 	push @params, $pspec;
 }
 
@@ -102,6 +110,12 @@
 	is_float ($pspec->get_maximum, $max, "$nick maximum");
 	is_float ($pspec->get_default_value, $default, "$nick default");
 	ok ($pspec->get_epsilon > 0.0, "$nick epsilon");
+	is ($pspec->values_cmp(22,33), -1);
+	is ($pspec->values_cmp(33,22), 1);
+	is ($pspec->values_cmp(22,22), 0);
+	is ($pspec->values_cmp(0, $pspec->get_epsilon / 2), 0);
+	is ($pspec->values_cmp($pspec->get_epsilon / 4,
+                               - $pspec->get_epsilon / 4), 0);
 	push @params, $pspec;
 }
 
@@ -116,6 +130,10 @@
 pspec_common_ok ($pspec, 'Enum', G_PARAM_READWRITE, 'Fish');
 is ($pspec->get_enum_class, 'Fish', 'enum class');
 is ($pspec->get_default_value, 'blue', "Enum default");
+is ($pspec->values_cmp('one','two'), -1);
+is ($pspec->values_cmp('red','blue'), -1);
+is ($pspec->values_cmp('blue','one'), 1);
+is ($pspec->values_cmp('red','red'), 0);
 push @params, $pspec;
 
 
@@ -125,6 +143,9 @@
 pspec_common_ok ($pspec, 'Flags', G_PARAM_READWRITE, 'Rain');
 is ($pspec->get_flags_class, 'Rain', 'flags class');
 ok ($pspec->get_default_value == ['light', 'warm'], 'Flags default');
+is ($pspec->values_cmp('warm','cold'), -1);
+is ($pspec->values_cmp(['cold','light'],['light']), 1);
+is ($pspec->values_cmp(['heavy'],'heavy'), 0);
 push @params, $pspec;
 
 
@@ -133,6 +154,10 @@
 	                         # we only know one boxed type at this point.
 	                         'Glib::Scalar', G_PARAM_READWRITE);
 pspec_common_ok ($pspec, 'Boxed', G_PARAM_READWRITE, 'Glib::Scalar');
+{ # 1 or -1 depending on address, which is unpredictable, so just test !=0
+  ok ($pspec->values_cmp('foo','bar') != 0);
+  # almost no Glib::Scalar has an equal address, so no tests for ==0 here
+}
 push @params, $pspec;
 
 
@@ -140,6 +165,7 @@
 	                          'I object, Your Honor, that\'s pure conjecture!',
 	                          'Skeezle', G_PARAM_READWRITE);
 pspec_common_ok ($pspec, 'Object', G_PARAM_READWRITE, 'Skeezle');
+is ($pspec->values_cmp(undef,undef), 0);
 push @params, $pspec;
 
 
@@ -155,6 +181,8 @@
 ok ($pspec->get_flags == G_PARAM_READWRITE, 'Param flags');
 is ($pspec->get_value_type, 'Glib::Param::Enum', 'Param value type');
 ok (! $pspec->get_owner_type, 'Param owner type');
+is ($pspec->values_cmp($pspec,$pspec), 0);
+ok ($pspec->values_cmp($pspec,$params[0]) != 0);
 push @params, $pspec;
 
 
@@ -163,6 +191,9 @@
 	                           'ö', qw/readable/);
 pspec_common_ok ($pspec, 'Unichar', qw/readable/, 'Glib::UInt');
 is ($pspec->get_default_value, 'ö', 'Unichar default');
+is ($pspec->values_cmp(65,66), -1);
+is ($pspec->values_cmp(66,65), 1);
+is ($pspec->values_cmp(66,66), 0);
 push @params, $pspec;
 
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]