Browse Source

shall iterate visit empty slots?

@jpfr: please check if the coded specifications on iterations over the
namespace meet your intentions
Leon Urbas 10 years ago
parent
commit
c7739e21c4
2 changed files with 65 additions and 7 deletions
  1. 8 7
      examples/src/generateSam.c
  2. 57 0
      tests/check_namespace.c

+ 8 - 7
examples/src/generateSam.c

@@ -7,13 +7,14 @@
 
 #include "ua_xml.h"
 #include <fcntl.h>
+#include <ctype.h>
 
 
 void sam_declareAttribute(UA_Node const * node) {
 	if (node->nodeClass == UA_NODECLASS_VARIABLE) {
+		printf("\t // i=%d\n",node->nodeId.identifier.numeric);
 		UA_VariableNode* vn = (UA_VariableNode*) node;
-		// printf("\t%s %*.s;\n", vn->value.vt->name, node->browseName.name.length, node->browseName.name.data);
-		printf("\t%s %s;\n", vn->value.vt->name, node->browseName.name.data);
+		printf("\t%s %c%.*s ;\n", UA_[UA_ns0ToVTableIndex(vn->dataType.identifier.numeric)].name, tolower(node->browseName.name.data[0]), node->browseName.name.length-1, &node->browseName.name.data[1]);
 	}
 }
 
@@ -25,7 +26,7 @@ void sam_declareBuffer(UA_Node const * node) {
 		case UA_STRING_NS0:
 		case UA_LOCALIZEDTEXT_NS0:
 		case UA_QUALIFIEDNAME_NS0:
-		printf("\t UA_Byte cstr_%*.s[] = \"\"\n",vn->browseName.name.length, vn->browseName.name.data);
+		printf("\t UA_Byte cstr_%.*s[] = \"\"\n",vn->browseName.name.length, vn->browseName.name.data);
 		break;
 		default:
 		break;
@@ -39,13 +40,13 @@ void sam_assignBuffer(UA_Node const * node) {
 		switch (vn->dataType.identifier.numeric) {
 		case UA_BYTESTRING_NS0:
 		case UA_STRING_NS0:
-		printf("\tSAM_ASSIGN_CSTRING(cstr_%*.s,sam.%*.s);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
+		printf("\tSAM_ASSIGN_CSTRING(cstr_%.*s,sam.%.*s);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
 		break;
 		case UA_LOCALIZEDTEXT_NS0:
-		printf("\tSAM_ASSIGN_CSTRING(cstr_%*.s,sam.%*.stext);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
+		printf("\tSAM_ASSIGN_CSTRING(cstr_%.*s,sam.%.*stext);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
 		break;
 		case UA_QUALIFIEDNAME_NS0:
-		printf("\tSAM_ASSIGN_CSTRING(cstr_%*.s,sam.%*.s.name);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
+		printf("\tSAM_ASSIGN_CSTRING(cstr_%.*s,sam.%.*s.name);\n",vn->browseName.name.length, vn->browseName.name.data,vn->browseName.name.length, vn->browseName.name.data);
 		break;
 		default:
 		break;
@@ -56,7 +57,7 @@ void sam_assignBuffer(UA_Node const * node) {
 void sam_attachToNamespace(UA_Node const * node) {
 	if (node->nodeClass == UA_NODECLASS_VARIABLE) {
 		UA_VariableNode* vn = (UA_VariableNode*) node;
-		printf("\tsam_attach(ns,%d,%s,&sam.%*.s);\n",node->nodeId.identifier.numeric,UA_[UA_ns0ToVTableIndex(vn->dataType.identifier.numeric)].name,node->browseName.name.length, node->browseName.name.data);
+		printf("\tsam_attach(ns,%d,%s,&sam.%.*s);\n",node->nodeId.identifier.numeric,UA_[UA_ns0ToVTableIndex(vn->dataType.identifier.numeric)].name,node->browseName.name.length, node->browseName.name.data);
 	}
 }
 

+ 57 - 0
tests/check_namespace.c

@@ -5,6 +5,13 @@
 #include "ua_namespace.h"
 #include "check.h"
 
+int zeroCnt = 0;
+int visitCnt = 0;
+void checkZeroVisitor(const UA_Node* node) {
+	visitCnt++;
+	if (node == UA_NULL) zeroCnt++;
+}
+
 START_TEST(test_Namespace) {
 	Namespace *ns = UA_NULL;
 	Namespace_new(&ns, 512, 0);
@@ -103,6 +110,31 @@ START_TEST(findNodeInNamespaceWithSeveralEntries) {
 }
 END_TEST
 
+START_TEST(iterateOverNamespaceShallNotVisitEmptyNodes) {
+	// given
+	Namespace *ns;
+	Namespace_new(&ns, 512, 0);
+	UA_Node* n1; createNode(&n1,0,2253); Namespace_insert(ns,n1);
+	UA_Node* n2; createNode(&n2,0,2255); Namespace_insert(ns,n2);
+	UA_Node* n3; createNode(&n3,0,2257); Namespace_insert(ns,n3);
+	UA_Node* n4; createNode(&n4,0,2200); Namespace_insert(ns,n4);
+	UA_Node* n5; createNode(&n5,0,1); Namespace_insert(ns,n5);
+	UA_Node* n6; createNode(&n6,0,12); Namespace_insert(ns,n6);
+
+	UA_Int32 retval;
+	// when
+	zeroCnt = 0;
+	visitCnt = 0;
+	retval = Namespace_iterate(ns,checkZeroVisitor);
+	// then
+	ck_assert_int_eq(retval, UA_SUCCESS);
+	ck_assert_int_eq(zeroCnt, 0);
+	ck_assert_int_eq(visitCnt, 6);
+	// finally
+	Namespace_delete(ns);
+}
+END_TEST
+
 START_TEST(findNodeInExpandedNamespace) {
 	// given
 	Namespace *ns;
@@ -126,6 +158,28 @@ START_TEST(findNodeInExpandedNamespace) {
 }
 END_TEST
 
+START_TEST(iterateOverExpandedNamespaceShallNotVisitEmptyNodes) {
+	// given
+	Namespace *ns;
+	Namespace_new(&ns, 10, 0);
+	UA_Node* n;
+	for (UA_Int32 i=0; i<200; i++) {
+		createNode(&n,0,i); Namespace_insert(ns,n);
+	}
+	// when
+	UA_Int32 retval;
+	zeroCnt = 0;
+	visitCnt = 0;
+	retval = Namespace_iterate(ns,checkZeroVisitor);
+	// then
+	ck_assert_int_eq(retval, UA_SUCCESS);
+	ck_assert_int_eq(zeroCnt, 0);
+	ck_assert_int_eq(visitCnt, 200);
+	// finally
+	Namespace_delete(ns);
+}
+END_TEST
+
 START_TEST(failToFindNonExistantNodeInNamespaceWithSeveralEntries) {
 	// given
 	Namespace *ns;
@@ -166,8 +220,11 @@ Suite * namespace_suite (void) {
 	tcase_add_test (tc_find, findNodeInExpandedNamespace);
 	tcase_add_test (tc_find, failToFindNonExistantNodeInNamespaceWithSeveralEntries);
 	tcase_add_test (tc_find, failToFindNodeInOtherNamespace);
+	tcase_add_test (tc_find, iterateOverNamespaceShallNotVisitEmptyNodes);
+	tcase_add_test (tc_find, iterateOverExpandedNamespaceShallNotVisitEmptyNodes);
 	suite_add_tcase (s, tc_find);
 
+
 	return s;
 }