summaryrefslogtreecommitdiff
path: root/source/tests/input_buffer.test.c
blob: bfbcaef053d9a7acafdec8ade90c0488106ec2f0 (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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "../kit/input_buffer.h"

#define KIT_TEST_FILE input_buffer
#include "../kit/kit_test.h"

TEST("input buffer read once") {
  str_t       text  = { .size = 3, .values = "foo" };
  is_handle_t in    = IS_WRAP_STRING(text);
  ib_handle_t first = IB_WRAP(in);

  ib_handle_t second = ib_read(first, 3);

  REQUIRE(second.status == KIT_OK);
  REQUIRE(second.data.size == 3);
  REQUIRE(AR_EQUAL(text, second.data));

  ib_destroy(second);
  ib_destroy(first);
  is_destroy(in);
}

TEST("input buffer read again") {
  str_t       text  = { .size = 6, .values = "foobar" };
  str_t       foo   = { .size = 3, .values = "foo" };
  is_handle_t in    = IS_WRAP_STRING(text);
  ib_handle_t first = IB_WRAP(in);

  ib_handle_t second = ib_read(first, 3);
  ib_handle_t third  = ib_read(first, 3);

  REQUIRE(AR_EQUAL(foo, second.data));
  REQUIRE(AR_EQUAL(foo, third.data));

  ib_destroy(third);
  ib_destroy(second);
  ib_destroy(first);
  is_destroy(in);
}

TEST("input buffer read twice") {
  str_t       text  = { .size = 6, .values = "foobar" };
  str_t       foo   = { .size = 3, .values = "foo" };
  str_t       bar   = { .size = 3, .values = "bar" };
  is_handle_t in    = IS_WRAP_STRING(text);
  ib_handle_t first = IB_WRAP(in);

  ib_handle_t second = ib_read(first, 3);
  ib_handle_t third  = ib_read(second, 3);

  REQUIRE(AR_EQUAL(foo, second.data));
  REQUIRE(AR_EQUAL(bar, third.data));

  ib_destroy(third);
  ib_destroy(second);
  ib_destroy(first);
  is_destroy(in);
}

static int is_integer_(str_t const data) {
  for (ptrdiff_t i = 0; i < data.size; i++)
    if (data.values[i] < '0' || data.values[i] > '9')
      return 0;
  return 1;
}

TEST("input buffer read integer once") {
  str_t       text  = { .size = 9, .values = "31415 foo" };
  str_t       num   = { .size = 5, .values = "31415" };
  is_handle_t in    = IS_WRAP_STRING(text);
  ib_handle_t first = IB_WRAP(in);

  ib_handle_t second = ib_read_while(first, is_integer_);

  REQUIRE(second.status == KIT_OK);
  REQUIRE(second.data.size == 5);
  REQUIRE(AR_EQUAL(num, second.data));

  ib_destroy(second);
  ib_destroy(first);
  is_destroy(in);
}

TEST("input buffer read integer twice") {
  str_t       text  = { .size = 6, .values = "314 15" };
  str_t       num_0 = { .size = 3, .values = "314" };
  str_t       num_1 = { .size = 2, .values = "15" };
  is_handle_t in    = IS_WRAP_STRING(text);
  ib_handle_t first = IB_WRAP(in);

  ib_handle_t second = ib_read_while(first, is_integer_);
  ib_handle_t third  = ib_read(second, 1);
  ib_handle_t fourth = ib_read_while(third, is_integer_);

  REQUIRE(fourth.status == KIT_OK);
  REQUIRE(second.data.size == 3);
  REQUIRE(fourth.data.size == 2);
  REQUIRE(AR_EQUAL(num_0, second.data));
  REQUIRE(AR_EQUAL(num_1, fourth.data));

  ib_destroy(first);
  ib_destroy(second);
  ib_destroy(third);
  ib_destroy(fourth);
  is_destroy(in);
}