ncdval_test.c 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. #include <stdio.h>
  2. #include <ncd/NCDVal.h>
  3. #include <base/BLog.h>
  4. #include <misc/debug.h>
  5. #define FORCE(cmd) if (!(cmd)) { fprintf(stderr, "failed\n"); exit(1); }
  6. static void print_indent (int indent)
  7. {
  8. for (int i = 0; i < indent; i++) {
  9. printf(" ");
  10. }
  11. }
  12. static void print_value (NCDValRef val, unsigned int indent)
  13. {
  14. switch (NCDVal_Type(val)) {
  15. case NCDVAL_STRING: {
  16. print_indent(indent);
  17. printf("string(%zu) %s\n", NCDVal_StringLength(val), NCDVal_StringValue(val));
  18. } break;
  19. case NCDVAL_LIST: {
  20. size_t count = NCDVal_ListCount(val);
  21. print_indent(indent);
  22. printf("list(%zu)\n", NCDVal_ListCount(val));
  23. for (size_t i = 0; i < count; i++) {
  24. NCDValRef elem_val = NCDVal_ListGet(val, i);
  25. print_value(elem_val, indent + 1);
  26. }
  27. } break;
  28. case NCDVAL_MAP: {
  29. print_indent(indent);
  30. printf("map(%zu)\n", NCDVal_MapCount(val));
  31. for (NCDValMapElem e = NCDVal_MapOrderedFirst(val); !NCDVal_MapElemInvalid(e); e = NCDVal_MapOrderedNext(val, e)) {
  32. NCDValRef ekey = NCDVal_MapElemKey(val, e);
  33. NCDValRef eval = NCDVal_MapElemVal(val, e);
  34. print_indent(indent + 1);
  35. printf("key=\n");
  36. print_value(ekey, indent + 2);
  37. print_indent(indent + 1);
  38. printf("val=\n");
  39. print_value(eval, indent + 2);
  40. }
  41. } break;
  42. }
  43. }
  44. int main ()
  45. {
  46. BLog_InitStdout();
  47. // Some basic usage of values.
  48. NCDValMem mem;
  49. NCDValMem_Init(&mem);
  50. NCDValRef s1 = NCDVal_NewString(&mem, "Hello World");
  51. FORCE( !NCDVal_IsInvalid(s1) )
  52. NCDValRef s2 = NCDVal_NewString(&mem, "This is reeeeeeeeeeeeeallllllllyyyyy fun!");
  53. FORCE( !NCDVal_IsInvalid(s2) )
  54. printf("%s. %s\n", NCDVal_StringValue(s1), NCDVal_StringValue(s2));
  55. NCDValRef l1 = NCDVal_NewList(&mem, 10);
  56. FORCE( !NCDVal_IsInvalid(l1) )
  57. NCDVal_ListAppend(l1, s1);
  58. NCDVal_ListAppend(l1, s2);
  59. print_value(s1, 0);
  60. print_value(s2, 0);
  61. print_value(l1, 0);
  62. NCDValRef k1 = NCDVal_NewString(&mem, "K1");
  63. FORCE( !NCDVal_IsInvalid(k1) )
  64. NCDValRef v1 = NCDVal_NewString(&mem, "V1");
  65. FORCE( !NCDVal_IsInvalid(v1) )
  66. NCDValRef k2 = NCDVal_NewString(&mem, "K2");
  67. FORCE( !NCDVal_IsInvalid(k2) )
  68. NCDValRef v2 = NCDVal_NewString(&mem, "V2");
  69. FORCE( !NCDVal_IsInvalid(v2) )
  70. NCDValRef m1 = NCDVal_NewMap(&mem, 2);
  71. FORCE( !NCDVal_IsInvalid(m1) )
  72. FORCE( NCDVal_MapInsert(m1, k1, v1) )
  73. FORCE( NCDVal_MapInsert(m1, k2, v2) )
  74. print_value(m1, 0);
  75. NCDValMem_Free(&mem);
  76. // Try to make copies of a string within the same memory object.
  77. // This is an evil test because we cannot simply copy a string using e.g.
  78. // NCDVal_NewStringBin() - it requires that the buffer passed
  79. // be outside the memory object of the new string.
  80. // We use NCDVal_NewCopy(), which takes care of this by creating
  81. // an uninitialized string using NCDVal_NewStringUninitialized() and
  82. // then copyng the data.
  83. NCDValMem_Init(&mem);
  84. NCDValRef s[100];
  85. s[0] = NCDVal_NewString(&mem, "Eeeeeeeeeeeevil.");
  86. FORCE( !NCDVal_IsInvalid(s[0]) )
  87. for (int i = 1; i < 100; i++) {
  88. s[i] = NCDVal_NewCopy(&mem, s[i - 1]);
  89. FORCE( !NCDVal_IsInvalid(s[i]) )
  90. ASSERT( !strcmp(NCDVal_StringValue(s[i - 1]), "Eeeeeeeeeeeevil.") )
  91. ASSERT( !strcmp(NCDVal_StringValue(s[i]), "Eeeeeeeeeeeevil.") )
  92. }
  93. for (int i = 0; i < 100; i++) {
  94. ASSERT( !strcmp(NCDVal_StringValue(s[i]), "Eeeeeeeeeeeevil.") )
  95. }
  96. NCDValMem_Free(&mem);
  97. return 0;
  98. }