[gobject-introspection] regress: Implement interface and override properties



commit b5b25328b75ad97836f585f708b60d8fc6bca902
Author: Philip Chimento <philip chimento gmail com>
Date:   Sun Aug 19 00:27:21 2018 -0400

    regress: Implement interface and override properties
    
    This adds a property to RegressTestInterface which can be overridden, and
    makes RegressTestSubObj implement it and override the property. This is
    in order to catch the regressions in GJS around property access.
    
    See gjs#193.

 .../Regress.TestInterface.page                     |  2 +-
 .../Regress.TestSubObj-boolean.page                | 15 ++++
 .../Regress.TestInterface.page                     |  6 +-
 .../Regress.TestSubObj-boolean.page                | 18 +++++
 .../Regress.TestSubObj.page                        |  4 +-
 .../Regress.TestInterface.page                     |  4 +-
 .../Regress.TestSubObj-boolean.page                | 18 +++++
 .../Regress.TestSubObj.page                        |  2 +-
 tests/scanner/Regress-1.0-expected.gir             | 19 +++++
 tests/scanner/regress.c                            | 80 +++++++++++++++++++++-
 tests/scanner/regress.h                            |  3 +
 11 files changed, 163 insertions(+), 8 deletions(-)
---
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.TestInterface.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.TestInterface.page
index 19e45215..2d72b94a 100644
--- a/tests/scanner/Regress-1.0-C-expected/Regress.TestInterface.page
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestInterface.page
@@ -17,7 +17,7 @@
   </synopsis>
   <synopsis>
     <title>Known Implementations</title>
-    <p>None</p>
+    <p>TestInterface is implemented by TestSubObj</p>
   </synopsis>
   <links type="topic" ui:expanded="true"
          api:type="function" api:mime="text/x-csrc"
diff --git a/tests/scanner/Regress-1.0-C-expected/Regress.TestSubObj-boolean.page 
b/tests/scanner/Regress-1.0-C-expected/Regress.TestSubObj-boolean.page
new file mode 100644
index 00000000..223c3e92
--- /dev/null
+++ b/tests/scanner/Regress-1.0-C-expected/Regress.TestSubObj-boolean.page
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<page id="Regress.TestSubObj-boolean"
+      type="topic"
+      style="property"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="Regress.TestSubObj" group="property" type="guide"/>
+    <title type="link" role="topic">boolean</title>
+  </info>
+  <title>Regress.TestSubObj:boolean</title>
+
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestInterface.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestInterface.page
index 5fb58df4..de94a5c0 100644
--- a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestInterface.page
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestInterface.page
@@ -12,7 +12,9 @@
   <synopsis><code>
 const Regress = imports.gi.Regress;
 
-let test_interface = new Regress.TestInterface();
+let test_interface = new Regress.TestInterface({
+    <link xref='Regress.TestInterface-number'>number</link>: value,
+});
   </code></synopsis>
 
 
@@ -22,7 +24,7 @@ let test_interface = new Regress.TestInterface();
   </synopsis>
   <synopsis>
     <title>Known Implementations</title>
-    <p>None</p>
+    <p>TestInterface is implemented by TestSubObj</p>
   </synopsis>
   <links type="topic" ui:expanded="true"
          api:type="function" api:mime="text/x-gjs"
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj-boolean.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj-boolean.page
new file mode 100644
index 00000000..b2be61b0
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj-boolean.page
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<page id="Regress.TestSubObj-boolean"
+      type="topic"
+      style="property"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="Regress.TestSubObj" group="property" type="guide"/>
+    <title type="link" role="topic">boolean</title>
+  </info>
+  <title>Regress.TestSubObj.boolean</title>
+  <synopsis><code mime="text/x-gjs">
+TestSubObj.boolean: Boolean (Read / Write / Construct)
+  </code></synopsis>
+
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj.page 
b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj.page
index d9f0885e..b69022bd 100644
--- a/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj.page
+++ b/tests/scanner/Regress-1.0-Gjs-expected/Regress.TestSubObj.page
@@ -12,7 +12,9 @@
   <synopsis><code>
 const Regress = imports.gi.Regress;
 
-let testSubObj = new Regress.TestSubObj();
+let testSubObj = new Regress.TestSubObj({
+    <link xref='Regress.TestSubObj-boolean'>boolean</link>: value,
+});
   </code></synopsis>
 
 
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestInterface.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.TestInterface.page
index 7fb4c88c..be09d3ad 100644
--- a/tests/scanner/Regress-1.0-Python-expected/Regress.TestInterface.page
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestInterface.page
@@ -12,7 +12,7 @@
   <synopsis><code>
 from gi.repository import Regress
 
-test_interface = Regress.TestInterface()  </code></synopsis>
+test_interface = Regress.TestInterface(<link xref='Regress.TestInterface-number'>number</link>=value)  
</code></synopsis>
 
 
   <synopsis>
@@ -21,7 +21,7 @@ test_interface = Regress.TestInterface()  </code></synopsis>
   </synopsis>
   <synopsis>
     <title>Known Implementations</title>
-    <p>None</p>
+    <p>TestInterface is implemented by TestSubObj</p>
   </synopsis>
   <links type="topic" ui:expanded="true"
          api:type="function" api:mime="text/python"
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj-boolean.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj-boolean.page
new file mode 100644
index 00000000..52071310
--- /dev/null
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj-boolean.page
@@ -0,0 +1,18 @@
+<?xml version="1.0"?>
+<page id="Regress.TestSubObj-boolean"
+      type="topic"
+      style="property"
+      xmlns="http://projectmallard.org/1.0/";
+      xmlns:api="http://projectmallard.org/experimental/api/";
+      xmlns:ui="http://projectmallard.org/1.0/ui/";>
+  <info>
+    <link xref="Regress.TestSubObj" group="property" type="guide"/>
+    <title type="link" role="topic">boolean</title>
+  </info>
+  <title>Regress.TestSubObj:boolean</title>
+  <synopsis><code mime="text/x-python">
+"boolean"             bool                : Read / Write / Construct
+  </code></synopsis>
+
+
+</page>
diff --git a/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj.page 
b/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj.page
index da1c0db4..e5b3a135 100644
--- a/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj.page
+++ b/tests/scanner/Regress-1.0-Python-expected/Regress.TestSubObj.page
@@ -12,7 +12,7 @@
   <synopsis><code>
 from gi.repository import Regress
 
-test_sub_obj = Regress.TestSubObj()
+test_sub_obj = Regress.TestSubObj(<link xref='Regress.TestSubObj-boolean'>boolean</link>=value)
   </code></synopsis>
 
 
diff --git a/tests/scanner/Regress-1.0-expected.gir b/tests/scanner/Regress-1.0-expected.gir
index 923e4725..2b4962ff 100644
--- a/tests/scanner/Regress-1.0-expected.gir
+++ b/tests/scanner/Regress-1.0-expected.gir
@@ -2919,6 +2919,12 @@ use it should be.</doc>
           </instance-parameter>
         </parameters>
       </method>
+      <property name="number"
+                writable="1"
+                construct="1"
+                transfer-ownership="none">
+        <type name="gint" c:type="gint"/>
+      </property>
       <glib:signal name="interface-signal" when="last">
         <return-value transfer-ownership="none">
           <type name="none" c:type="void"/>
@@ -4318,6 +4324,7 @@ the introspection client langage.</doc>
            glib:type-name="RegressTestSubObj"
            glib:get-type="regress_test_sub_obj_get_type"
            glib:type-struct="TestSubObjClass">
+      <implements name="TestInterface"/>
       <constructor name="new" c:identifier="regress_test_sub_obj_new">
         <return-value transfer-ownership="full">
           <type name="TestObj" c:type="RegressTestObj*"/>
@@ -4344,9 +4351,21 @@ the introspection client langage.</doc>
           </instance-parameter>
         </parameters>
       </method>
+      <property name="boolean"
+                writable="1"
+                construct="1"
+                transfer-ownership="none">
+        <type name="gboolean" c:type="gboolean"/>
+      </property>
       <field name="parent_instance">
         <type name="TestObj" c:type="RegressTestObj"/>
       </field>
+      <field name="number" readable="0" private="1">
+        <type name="gint" c:type="gint"/>
+      </field>
+      <field name="boolean" readable="0" private="1">
+        <type name="gboolean" c:type="gboolean"/>
+      </field>
     </class>
     <record name="TestSubObjClass"
             c:type="RegressTestSubObjClass"
diff --git a/tests/scanner/regress.c b/tests/scanner/regress.c
index f998a498..6f1c4c3b 100644
--- a/tests/scanner/regress.c
+++ b/tests/scanner/regress.c
@@ -3228,12 +3228,82 @@ struct _CallbackInfo
   gpointer user_data;
 };
 
+static void
+regress_test_sub_obj_iface_init (RegressTestInterfaceIface *iface)
+{
+}
+
+enum {
+  PROP_TEST_SUB_OBJ_NUMBER = 1,
+  PROP_TEST_SUB_OBJ_BOOLEAN,
+};
+
+G_DEFINE_TYPE_WITH_CODE(RegressTestSubObj, regress_test_sub_obj,
+                        REGRESS_TEST_TYPE_OBJ,
+                        G_IMPLEMENT_INTERFACE(REGRESS_TEST_TYPE_INTERFACE,
+                                              regress_test_sub_obj_iface_init));
+
+
+static void
+regress_test_sub_obj_set_property (GObject      *object,
+                                   guint         property_id,
+                                   const GValue *value,
+                                   GParamSpec   *pspec)
+{
+  RegressTestSubObj *self = REGRESS_TEST_SUB_OBJECT (object);
 
-G_DEFINE_TYPE(RegressTestSubObj, regress_test_sub_obj, REGRESS_TEST_TYPE_OBJ);
+  switch (property_id)
+    {
+    case PROP_TEST_SUB_OBJ_NUMBER:
+      self->number = g_value_get_int (value);
+      break;
+
+    case PROP_TEST_SUB_OBJ_BOOLEAN:
+      self->boolean = g_value_get_boolean (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+    }
+}
+
+static void
+regress_test_sub_obj_get_property (GObject    *object,
+                                   guint       property_id,
+                                   GValue     *value,
+                                   GParamSpec *pspec)
+{
+  RegressTestSubObj *self = REGRESS_TEST_SUB_OBJECT (object);
+
+  switch (property_id)
+    {
+    case PROP_TEST_SUB_OBJ_NUMBER:
+      g_value_set_int (value, self->number);
+      break;
+
+    case PROP_TEST_SUB_OBJ_BOOLEAN:
+      g_value_set_boolean (value, self->boolean);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+    }
+}
 
 static void
 regress_test_sub_obj_class_init (RegressTestSubObjClass *klass)
 {
+  const guint flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS;
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->get_property = regress_test_sub_obj_get_property;
+  gobject_class->set_property = regress_test_sub_obj_set_property;
+
+  g_object_class_install_property (gobject_class, PROP_TEST_SUB_OBJ_BOOLEAN,
+                                   g_param_spec_boolean ("boolean", "Boolean", "Boolean",
+                                                         TRUE, flags));
+
+  g_object_class_override_property (gobject_class, PROP_TEST_SUB_OBJ_NUMBER,
+                                    "number");
 }
 
 static void
@@ -3970,6 +4040,7 @@ G_DEFINE_INTERFACE (RegressTestInterface, regress_test_interface, G_TYPE_OBJECT)
 static void
 regress_test_interface_default_init(RegressTestInterfaceIface *iface)
 {
+  const guint flags = G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS;
   static gboolean initialized = FALSE;
   if (initialized)
     return;
@@ -3984,6 +4055,13 @@ regress_test_interface_default_init(RegressTestInterfaceIface *iface)
                 G_SIGNAL_RUN_LAST, 0, NULL, NULL, NULL,
                 G_TYPE_NONE, 1, G_TYPE_POINTER);
 
+  /**
+   * RegressTestInterface:number:
+   */
+  g_object_interface_install_property (iface,
+                                       g_param_spec_int ("number", "Number", "Number",
+                                                         0, 10, 0, flags));
+
   initialized = TRUE;
 }
 
diff --git a/tests/scanner/regress.h b/tests/scanner/regress.h
index f0885f2b..167a71d9 100644
--- a/tests/scanner/regress.h
+++ b/tests/scanner/regress.h
@@ -968,6 +968,9 @@ typedef struct _RegressTestSubObjClass    RegressTestSubObjClass;
 struct _RegressTestSubObj
 {
   RegressTestObj parent_instance;
+  /*< private >*/
+  gint number;
+  gboolean boolean;
 };
 
 struct _RegressTestSubObjClass


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