|
@@ -4,45 +4,12 @@
|
|
|
|
|
|
#define JIM_IMPLEMENTATION
|
|
|
#include "./jim.h"
|
|
|
+#define NOB_IMPLEMENTATION
|
|
|
+#define NOB_STRIP_PREFIX
|
|
|
+#include "./nob.h"
|
|
|
|
|
|
#include "./test_expected.h"
|
|
|
|
|
|
-#define ARRAY_LEN(xs) (sizeof(xs) / sizeof((xs)[0]))
|
|
|
-
|
|
|
-typedef struct {
|
|
|
- size_t capacity;
|
|
|
- size_t size;
|
|
|
- char *data;
|
|
|
-} Buffer;
|
|
|
-
|
|
|
-void buffer_clean(Buffer *buffer)
|
|
|
-{
|
|
|
- buffer->size = 0;
|
|
|
-}
|
|
|
-
|
|
|
-size_t buffer_write(const void *ptr, size_t size, size_t nmemb,
|
|
|
- Buffer *sink)
|
|
|
-{
|
|
|
- size_t esize = size * nmemb; // effective size
|
|
|
-
|
|
|
- if (sink->size + esize <= sink->capacity) {
|
|
|
- memcpy(sink->data + sink->size,
|
|
|
- ptr,
|
|
|
- esize);
|
|
|
- sink->size += esize;
|
|
|
- return esize;
|
|
|
- } else {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static char static_memory_for_buffer[1024];
|
|
|
-
|
|
|
-static Buffer buffer = {
|
|
|
- .capacity = sizeof(static_memory_for_buffer),
|
|
|
- .data = static_memory_for_buffer
|
|
|
-};
|
|
|
-
|
|
|
void null_case(Jim *jim)
|
|
|
{
|
|
|
jim_array_begin(jim);
|
|
@@ -144,54 +111,42 @@ const Test_Case test_cases[] = {
|
|
|
TEST_CASE(object_case),
|
|
|
};
|
|
|
|
|
|
-void record(const char *header_path)
|
|
|
+bool record(const char *header_path)
|
|
|
{
|
|
|
- FILE *stream = fopen(header_path, "w");
|
|
|
-
|
|
|
- Jim jim_stream = {
|
|
|
- .sink = stream,
|
|
|
- .write = (Jim_Write) fwrite,
|
|
|
- };
|
|
|
+ Jim jim_stream = {0};
|
|
|
+ Jim jim_buffer = {0};
|
|
|
|
|
|
- Jim jim_buffer = {
|
|
|
- .sink = &buffer,
|
|
|
- .write = (Jim_Write) buffer_write,
|
|
|
- };
|
|
|
-
|
|
|
- fprintf(stream, "const char *test_cases_expected[] = {\n");
|
|
|
+ jim_write_cstr(&jim_stream, "const char *test_cases_expected[] = {\n");
|
|
|
for (size_t i = 0; i < ARRAY_LEN(test_cases); ++i) {
|
|
|
- buffer_clean(&buffer);
|
|
|
+ jim_buffer.sink_count = 0;
|
|
|
test_cases[i].run(&jim_buffer);
|
|
|
- fprintf(stream, " ");
|
|
|
- jim_string_sized(&jim_stream, buffer.data, buffer.size);
|
|
|
- fprintf(stream, ",\n");
|
|
|
+ jim_write_cstr(&jim_stream, " ");
|
|
|
+ jim_string_sized(&jim_stream, jim_buffer.sink, jim_buffer.sink_count);
|
|
|
+ jim_write_cstr(&jim_stream, ",\n");
|
|
|
}
|
|
|
- fprintf(stream, "};\n");
|
|
|
-
|
|
|
- fclose(stream);
|
|
|
+ jim_write_cstr(&jim_stream, "};\n");
|
|
|
|
|
|
+ if (!write_entire_file(header_path, jim_stream.sink, jim_stream.sink_count)) return false;
|
|
|
printf("Updated %s\n", header_path);
|
|
|
+ return true;
|
|
|
}
|
|
|
|
|
|
void test(void)
|
|
|
{
|
|
|
- Jim jim_buffer = {
|
|
|
- .sink = &buffer,
|
|
|
- .write = (Jim_Write) buffer_write,
|
|
|
- };
|
|
|
+ Jim jim_buffer = {0};
|
|
|
|
|
|
for (size_t i = 0; i < ARRAY_LEN(test_cases); ++i) {
|
|
|
printf("%s ... ", test_cases[i].name);
|
|
|
|
|
|
- buffer_clean(&buffer);
|
|
|
+ jim_buffer.sink_count = 0;
|
|
|
test_cases[i].run(&jim_buffer);
|
|
|
|
|
|
- if (buffer.size != strlen(test_cases_expected[i])
|
|
|
- || memcmp(buffer.data, test_cases_expected[i], buffer.size) != 0) {
|
|
|
+ if (jim_buffer.sink_count != strlen(test_cases_expected[i])
|
|
|
+ || memcmp(jim_buffer.sink, test_cases_expected[i], jim_buffer.sink_count) != 0) {
|
|
|
printf("FAILED!\n");
|
|
|
printf("Expected: %s\n", test_cases_expected[i]);
|
|
|
printf("Actual: ");
|
|
|
- fwrite(buffer.data, 1, buffer.size, stdout);
|
|
|
+ fwrite(jim_buffer.sink, jim_buffer.sink_count, 1, stdout);
|
|
|
printf("\n");
|
|
|
exit(1);
|
|
|
}
|
|
@@ -204,7 +159,7 @@ int main(int argc, char **argv)
|
|
|
{
|
|
|
if (argc >= 2) {
|
|
|
if (strcmp(argv[1], "record") == 0) {
|
|
|
- record("test_expected.h");
|
|
|
+ if (!record("test_expected.h")) return 1;
|
|
|
} else {
|
|
|
fprintf(stderr, "Usage: ./test [record]\n");
|
|
|
fprintf(stderr, "ERROR: unknown subcommand %s.\n", argv[1]);
|