summaryrefslogtreecommitdiff
path: root/tests/test_string.c
blob: 4fdab6c64b8aaa5adf6aa92cb68f5a32d0913157 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

#undef NDEBUG  /* ensure tests always assert. */
#include "upb_string.h"

char static_str[] = "Static string.";

int main() {
  upb_string *str = upb_string_new();
  assert(str != NULL);
  upb_string_unref(str);

  // Can also create a string by tryrecycle(NULL).
  str = upb_string_tryrecycle(NULL);
  assert(str != NULL);

  upb_strcpyc(str, static_str);
  assert(upb_string_len(str) == (sizeof(static_str) - 1));
  const char *robuf = upb_string_getrobuf(str);
  assert(robuf != NULL);
  assert(memcmp(robuf, static_str, upb_string_len(str)) == 0);
  upb_string_endread(str);

  upb_string *str2 = upb_string_tryrecycle(str);
  // No other referents, so should return the same string.
  assert(str2 == str);

  // Write a shorter string, the same memory should be reused.
  upb_strcpyc(str, "XX");
  const char *robuf2 = upb_string_getrobuf(str);
  assert(robuf2 == robuf);
  assert(memcmp(robuf2, "XX", 2) == 0);

  // Make string alias part of another string.
  str2 = upb_strdupc("WXYZ");
  upb_string_substr(str, str2, 1, 2);
  assert(upb_string_len(str) == 2);
  assert(upb_string_len(str2) == 4);
  // The two string should be aliasing the same data.
  const char *robuf3 = upb_string_getrobuf(str);
  const char *robuf4 = upb_string_getrobuf(str2);
  assert(robuf3 == robuf4 + 1);
  // The aliased string should have an extra ref.
  assert(upb_atomic_read(&str2->refcount) == 2);

  // Recycling str should eliminate the extra ref.
  str = upb_string_tryrecycle(str);
  assert(upb_atomic_read(&str2->refcount) == 1);

  // Resetting str should reuse its old data.
  upb_strcpyc(str, "XX");
  const char *robuf5 = upb_string_getrobuf(str);
  assert(robuf5 == robuf);

  upb_string_unref(str);
  upb_string_unref(str2);
}
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback