44
55#define JIM_IMPLEMENTATION
66#include "./jim.h"
7+ #define NOB_IMPLEMENTATION
8+ #define NOB_STRIP_PREFIX
9+ #include "./nob.h"
710
811#include "./test_expected.h"
912
10- #define ARRAY_LEN (xs ) (sizeof(xs) / sizeof((xs)[0]))
11-
12- typedef struct {
13- size_t capacity ;
14- size_t size ;
15- char * data ;
16- } Buffer ;
17-
18- void buffer_clean (Buffer * buffer )
19- {
20- buffer -> size = 0 ;
21- }
22-
23- size_t buffer_write (const void * ptr , size_t size , size_t nmemb ,
24- Buffer * sink )
25- {
26- size_t esize = size * nmemb ; // effective size
27-
28- if (sink -> size + esize <= sink -> capacity ) {
29- memcpy (sink -> data + sink -> size ,
30- ptr ,
31- esize );
32- sink -> size += esize ;
33- return esize ;
34- } else {
35- return 0 ;
36- }
37- }
38-
39- static char static_memory_for_buffer [1024 ];
40-
41- static Buffer buffer = {
42- .capacity = sizeof (static_memory_for_buffer ),
43- .data = static_memory_for_buffer
44- };
45-
4613void null_case (Jim * jim )
4714{
4815 jim_array_begin (jim );
@@ -144,54 +111,42 @@ const Test_Case test_cases[] = {
144111 TEST_CASE (object_case ),
145112};
146113
147- void record (const char * header_path )
114+ bool record (const char * header_path )
148115{
149- FILE * stream = fopen (header_path , "w" );
150-
151- Jim jim_stream = {
152- .sink = stream ,
153- .write = (Jim_Write ) fwrite ,
154- };
116+ Jim jim_stream = {0 };
117+ Jim jim_buffer = {0 };
155118
156- Jim jim_buffer = {
157- .sink = & buffer ,
158- .write = (Jim_Write ) buffer_write ,
159- };
160-
161- fprintf (stream , "const char *test_cases_expected[] = {\n" );
119+ jim_write_cstr (& jim_stream , "const char *test_cases_expected[] = {\n" );
162120 for (size_t i = 0 ; i < ARRAY_LEN (test_cases ); ++ i ) {
163- buffer_clean ( & buffer ) ;
121+ jim_buffer . sink_count = 0 ;
164122 test_cases [i ].run (& jim_buffer );
165- fprintf ( stream , " " );
166- jim_string_sized (& jim_stream , buffer . data , buffer . size );
167- fprintf ( stream , ",\n" );
123+ jim_write_cstr ( & jim_stream , " " );
124+ jim_string_sized (& jim_stream , jim_buffer . sink , jim_buffer . sink_count );
125+ jim_write_cstr ( & jim_stream , ",\n" );
168126 }
169- fprintf (stream , "};\n" );
170-
171- fclose (stream );
127+ jim_write_cstr (& jim_stream , "};\n" );
172128
129+ if (!write_entire_file (header_path , jim_stream .sink , jim_stream .sink_count )) return false;
173130 printf ("Updated %s\n" , header_path );
131+ return true;
174132}
175133
176134void test (void )
177135{
178- Jim jim_buffer = {
179- .sink = & buffer ,
180- .write = (Jim_Write ) buffer_write ,
181- };
136+ Jim jim_buffer = {0 };
182137
183138 for (size_t i = 0 ; i < ARRAY_LEN (test_cases ); ++ i ) {
184139 printf ("%s ... " , test_cases [i ].name );
185140
186- buffer_clean ( & buffer ) ;
141+ jim_buffer . sink_count = 0 ;
187142 test_cases [i ].run (& jim_buffer );
188143
189- if (buffer . size != strlen (test_cases_expected [i ])
190- || memcmp (buffer . data , test_cases_expected [i ], buffer . size ) != 0 ) {
144+ if (jim_buffer . sink_count != strlen (test_cases_expected [i ])
145+ || memcmp (jim_buffer . sink , test_cases_expected [i ], jim_buffer . sink_count ) != 0 ) {
191146 printf ("FAILED!\n" );
192147 printf ("Expected: %s\n" , test_cases_expected [i ]);
193148 printf ("Actual: " );
194- fwrite (buffer . data , 1 , buffer . size , stdout );
149+ fwrite (jim_buffer . sink , jim_buffer . sink_count , 1 , stdout );
195150 printf ("\n" );
196151 exit (1 );
197152 }
@@ -204,7 +159,7 @@ int main(int argc, char **argv)
204159{
205160 if (argc >= 2 ) {
206161 if (strcmp (argv [1 ], "record" ) == 0 ) {
207- record ("test_expected.h" );
162+ if (! record ("test_expected.h" )) return 1 ;
208163 } else {
209164 fprintf (stderr , "Usage: ./test [record]\n" );
210165 fprintf (stderr , "ERROR: unknown subcommand %s.\n" , argv [1 ]);
0 commit comments