mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	Add table test. Add :repeat to loop macro.
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -155,6 +155,7 @@ test: $(JANET_TARGET) $(TEST_PROGRAMS) | |||||||
| 	ctest/system_test.out | 	ctest/system_test.out | ||||||
| 	ctest/array_test.out | 	ctest/array_test.out | ||||||
| 	ctest/buffer_test.out | 	ctest/buffer_test.out | ||||||
|  | 	ctest/table_test.out | ||||||
| 	./$(JANET_TARGET) test/suite0.janet | 	./$(JANET_TARGET) test/suite0.janet | ||||||
| 	./$(JANET_TARGET) test/suite1.janet | 	./$(JANET_TARGET) test/suite1.janet | ||||||
| 	./$(JANET_TARGET) test/suite2.janet | 	./$(JANET_TARGET) test/suite2.janet | ||||||
| @@ -163,6 +164,7 @@ valtest: $(JANET_TARGET) $(TEST_PROGRAMS) | |||||||
| 	valgrind --leak-check=full -b ctest/system_test.out | 	valgrind --leak-check=full -b ctest/system_test.out | ||||||
| 	valgrind --leak-check=full -v ctest/array_test.out | 	valgrind --leak-check=full -v ctest/array_test.out | ||||||
| 	valgrind --leak-check=full -v ctest/buffer_test.out | 	valgrind --leak-check=full -v ctest/buffer_test.out | ||||||
|  | 	valgrind --leak-check=full -v ctest/table_test.out | ||||||
| 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite0.janet | 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite0.janet | ||||||
| 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite1.janet | 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite1.janet | ||||||
| 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite2.janet | 	valgrind --leak-check=full -v ./$(JANET_TARGET) test/suite2.janet | ||||||
|   | |||||||
							
								
								
									
										58
									
								
								ctest/table_test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								ctest/table_test.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | |||||||
|  | /* | ||||||
|  | * Copyright (c) 2018 Calvin Rose | ||||||
|  | * | ||||||
|  | * Permission is hereby granted, free of charge, to any person obtaining a copy | ||||||
|  | * of this software and associated documentation files (the "Software"), to | ||||||
|  | * deal in the Software without restriction, including without limitation the | ||||||
|  | * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or | ||||||
|  | * sell copies of the Software, and to permit persons to whom the Software is | ||||||
|  | * furnished to do so, subject to the following conditions: | ||||||
|  | * | ||||||
|  | * The above copyright notice and this permission notice shall be included in | ||||||
|  | * all copies or substantial portions of the Software. | ||||||
|  | * | ||||||
|  | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | ||||||
|  | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | ||||||
|  | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | ||||||
|  | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||||
|  | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||||||
|  | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS | ||||||
|  | * IN THE SOFTWARE. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | #include <janet/janet.h> | ||||||
|  | #include <assert.h> | ||||||
|  |  | ||||||
|  | int main() { | ||||||
|  |      | ||||||
|  |     JanetTable *t1; | ||||||
|  |  | ||||||
|  |     janet_init(); | ||||||
|  |  | ||||||
|  |     t1 = janet_table(10); | ||||||
|  |  | ||||||
|  |     janet_table_put(t1, janet_cstringv("hello"), janet_wrap_integer(2)); | ||||||
|  |     janet_table_put(t1, janet_cstringv("akey"), janet_wrap_integer(5)); | ||||||
|  |     janet_table_put(t1, janet_cstringv("box"), janet_wrap_boolean(0)); | ||||||
|  |     janet_table_put(t1, janet_cstringv("square"), janet_cstringv("avalue")); | ||||||
|  |  | ||||||
|  |     assert(t1->count == 4); | ||||||
|  |     assert(t1->capacity >= t1->count); | ||||||
|  |      | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("hello")), janet_wrap_integer(2))); | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("akey")), janet_wrap_integer(5))); | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("box")), janet_wrap_boolean(0))); | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("square")), janet_cstringv("avalue"))); | ||||||
|  |  | ||||||
|  |     janet_table_remove(t1, janet_cstringv("hello")); | ||||||
|  |     janet_table_put(t1, janet_cstringv("box"), janet_wrap_nil()); | ||||||
|  |  | ||||||
|  |     assert(t1->count == 2); | ||||||
|  |  | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("hello")), janet_wrap_nil())); | ||||||
|  |     assert(janet_equals(janet_table_get(t1, janet_cstringv("box")), janet_wrap_nil())); | ||||||
|  |  | ||||||
|  |     janet_deinit(); | ||||||
|  |  | ||||||
|  |     return 0; | ||||||
|  | } | ||||||
| @@ -279,7 +279,8 @@ | |||||||
|   \t:while expression - breaks from the loop if expression is falsey.\n |   \t:while expression - breaks from the loop if expression is falsey.\n | ||||||
|   \t:let bindings - defines bindings inside the loop as passed to the let macro.\n |   \t:let bindings - defines bindings inside the loop as passed to the let macro.\n | ||||||
|   \t:before form - evaluates a form for a side effect before of the next inner loop.\n |   \t:before form - evaluates a form for a side effect before of the next inner loop.\n | ||||||
|   \t:after form - same as :befor, but the side effect happens after the next inner loop.\n |   \t:after form - same as :before, but the side effect happens after the next inner loop.\n | ||||||
|  |   \t:repeat n - repeats the next inner loop n times.\n | ||||||
|   \t:when condition - only evaluates the loop body when condition is true.\n\n |   \t:when condition - only evaluates the loop body when condition is true.\n\n | ||||||
|   The loop macro always evaluates to nil." |   The loop macro always evaluates to nil." | ||||||
|   [head & body] |   [head & body] | ||||||
| @@ -306,7 +307,19 @@ | |||||||
|             :when (tuple 'if verb (doone (+ i 2))) |             :when (tuple 'if verb (doone (+ i 2))) | ||||||
|             :before (tuple 'do verb (doone (+ i 2))) |             :before (tuple 'do verb (doone (+ i 2))) | ||||||
|             :after (tuple 'do (doone (+ i 2)) verb) |             :after (tuple 'do (doone (+ i 2)) verb) | ||||||
|             (error ("unexpected loop predicate: " verb))) |             :repeat (do | ||||||
|  |                       (def $iter (gensym)) | ||||||
|  |                       (def $n (gensym)) | ||||||
|  |                       (def spreds @['and (tuple < $iter $n)]) | ||||||
|  |                       (def sub (doone (+ i 2) spreds)) | ||||||
|  |                       (tuple 'do | ||||||
|  |                              (tuple 'def $n verb) | ||||||
|  |                              (tuple 'var $iter 0) | ||||||
|  |                              (tuple 'while | ||||||
|  |                                     (tuple.slice spreds) | ||||||
|  |                                     (tuple := $iter (tuple + 1 $iter)) | ||||||
|  |                                     sub))) | ||||||
|  |             (error (string "unexpected loop predicate: " bindings))) | ||||||
|           (case verb |           (case verb | ||||||
|             :iterate (do |             :iterate (do | ||||||
|                        (def $iter (gensym)) |                        (def $iter (gensym)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose