Types: fix fieldnames for Scicos objects 64/17064/1
Paul Bignier [Wed, 8 Jul 2015 07:48:21 +0000 (09:48 +0200)]
Change-Id: Ie6673295fd5aac362ca7346fc65a20aa3ff7171d

scilab/modules/data_structures/tests/unit_tests/fieldnames.dia.ref [deleted file]
scilab/modules/data_structures/tests/unit_tests/fieldnames.tst [deleted file]
scilab/modules/types/sci_gateway/cpp/sci_fieldnames.cpp
scilab/modules/types/tests/unit_tests/fieldnames.dia.ref [new file with mode: 0644]
scilab/modules/types/tests/unit_tests/fieldnames.tst [new file with mode: 0644]

diff --git a/scilab/modules/data_structures/tests/unit_tests/fieldnames.dia.ref b/scilab/modules/data_structures/tests/unit_tests/fieldnames.dia.ref
deleted file mode 100644 (file)
index 1679d90..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2009 - INRIA - Serge.Steer@inria.fr
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-// <-- ENGLISH IMPOSED -->
-// <-- CLI SHELL MODE -->
-// unit tests for fieldnames function
-// =============================================================================
-if fieldnames(1)<>[] then bugmes();quit;end
-my_struct = struct("field_1",123,"field_2",456);
-if or(fieldnames(my_struct)<>["field_1";"field_2"]) then bugmes();quit;end
-clear T;
-T.a=rand(2,2);
-T.b='s';
-if or(fieldnames(T)<>["a";"b"]) then bugmes();quit;end
-if or(fieldnames(1/%s)<>["num";"den";"dt"]) then bugmes();quit;end
-M=mlist(['foo','A','B','C'],[],[],[])
- M  =
-       M(1)
-!foo  A  B  C  !
-       M(2)
-     []
-       M(3)
-     []
-       M(4)
-     []
-if or(fieldnames(M)<>['A';'B';'C']) then bugmes();quit;end
diff --git a/scilab/modules/data_structures/tests/unit_tests/fieldnames.tst b/scilab/modules/data_structures/tests/unit_tests/fieldnames.tst
deleted file mode 100644 (file)
index ea1bb42..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-// =============================================================================
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2009 - INRIA - Serge.Steer@inria.fr
-//
-//  This file is distributed under the same license as the Scilab package.
-// =============================================================================
-
-// <-- ENGLISH IMPOSED -->
-// <-- CLI SHELL MODE -->
-
-// unit tests for fieldnames function
-// =============================================================================
-
-if fieldnames(1)<>[] then pause,end
-
-my_struct = struct("field_1",123,"field_2",456);
-if or(fieldnames(my_struct)<>["field_1";"field_2"]) then pause,end
-
-clear T;
-T.a=rand(2,2);
-T.b='s';
-if or(fieldnames(T)<>["a";"b"]) then pause,end
-
-
-if or(fieldnames(1/%s)<>["num";"den";"dt"]) then pause,end
-
-M=mlist(['foo','A','B','C'],[],[],[])
-if or(fieldnames(M)<>['A';'B';'C']) then pause,end
index 68440be..334d446 100644 (file)
@@ -78,17 +78,17 @@ Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list
         }
     }
 
-    // USER-TYPE (typically a Xcos object)
+    // USER-TYPE (typically an Xcos object)
     if (in[0]->isUserType() == true)
     {
         // We only need userType capabilities to retrieve first argument as UserType.
         UserType *pInUser = in[0]->getAs<UserType>();
 
-        // Extract "diagram" first then the properties, or all in one shot?? Should DiagramA implement such a routine or should fieldnames include DiagramA?
-        //std::cout<<"diag "<<pInUser->getSharedTypeStr()<<std::endl;
+        // Extract the sub-type
+        std::wstring subType (pInUser->getShortTypeStr());
 
         // Extract the properties
-        typed_list one (1, new types::Double(1));
+        typed_list one (1, new Double(1));
         InternalType* pProperties = pInUser->extract(&one);
         if (pProperties == nullptr || pProperties->isString() == false)
         {
@@ -97,6 +97,14 @@ Function::ReturnValue sci_fieldnames(typed_list &in, int _iRetCount, typed_list
             out.push_back(Double::Empty());
             return Function::OK;
         }
+        int nProp = ((String*) pProperties)->getSize();
+
+        pIT = new String(nProp + 1, 1);
+        ((String*) pIT)->set(0, subType.data());
+        for (int i = 0; i < nProp; ++i)
+        {
+            ((String*) pIT)->set(i + 1, ((String*) pProperties)->get(i));
+        }
     }
 
     String *pAllFields = pIT->getAs<String>();
diff --git a/scilab/modules/types/tests/unit_tests/fieldnames.dia.ref b/scilab/modules/types/tests/unit_tests/fieldnames.dia.ref
new file mode 100644 (file)
index 0000000..be72b54
--- /dev/null
@@ -0,0 +1,32 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+// Copyright (C) 2009 - INRIA - Serge.Steer@inria.fr
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- CLI SHELL MODE -->
+// unit tests for fieldnames function
+// =============================================================================
+assert_checkequal(fieldnames(1), []);
+my_struct = struct("field_1", 123, "field_2", 456);
+assert_checkequal(fieldnames(my_struct), ["field_1"; "field_2"]);
+clear T;
+T.a = rand(2, 2);
+T.b = "s";
+assert_checkequal(fieldnames(T), ["a"; "b"]);
+assert_checkequal(fieldnames(1/%s), ["num"; "den"; "dt"]);
+M = mlist(["foo" "A" "B" "C"], [], [], []);
+assert_checkequal(fieldnames(M), ["A"; "B"; "C"]);
+// Scicos objects
+d = scicos_diagram();
+assert_checkequal(fieldnames(d), ["props"; "objs"; "version"; "contrib"]);
+b = scicos_block();
+assert_checkequal(fieldnames(b), ["graphics"; "model"; "gui"; "doc"]);
+l = scicos_link();
+assert_checkequal(fieldnames(l), ["xx"; "yy"; "id"; "thick"; "ct"; "from"; "to"]);
diff --git a/scilab/modules/types/tests/unit_tests/fieldnames.tst b/scilab/modules/types/tests/unit_tests/fieldnames.tst
new file mode 100644 (file)
index 0000000..340c16c
--- /dev/null
@@ -0,0 +1,41 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+// Copyright (C) 2009 - INRIA - Serge.Steer@inria.fr
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- CLI SHELL MODE -->
+
+// unit tests for fieldnames function
+// =============================================================================
+
+assert_checkequal(fieldnames(1), []);
+
+my_struct = struct("field_1", 123, "field_2", 456);
+assert_checkequal(fieldnames(my_struct), ["field_1"; "field_2"]);
+
+clear T;
+T.a = rand(2, 2);
+T.b = "s";
+assert_checkequal(fieldnames(T), ["a"; "b"]);
+
+
+assert_checkequal(fieldnames(1/%s), ["num"; "den"; "dt"]);
+
+M = mlist(["foo" "A" "B" "C"], [], [], []);
+assert_checkequal(fieldnames(M), ["A"; "B"; "C"]);
+
+
+// Scicos objects
+d = scicos_diagram();
+assert_checkequal(fieldnames(d), ["props"; "objs"; "version"; "contrib"]);
+b = scicos_block();
+assert_checkequal(fieldnames(b), ["graphics"; "model"; "gui"; "doc"]);
+l = scicos_link();
+assert_checkequal(fieldnames(l), ["xx"; "yy"; "id"; "thick"; "ct"; "from"; "to"]);