Ver código fonte

Added some ctests and some infra to make CTests relatively easily

main
Ludovic 'Archivist' Lagouardette 1 dia atrás
pai
commit
e9ea189cf9
4 arquivos alterados com 215 adições e 0 exclusões
  1. +16
    -0
      CMakeLists.txt
  2. +116
    -0
      test/array_shenanigans.c
  3. +50
    -0
      test/macro_optimized.c
  4. +33
    -0
      test/sequence_of_20s.c

+ 16
- 0
CMakeLists.txt Ver arquivo

@ -1,6 +1,8 @@
cmake_minimum_required(VERSION 3.0)
project(ink C)
include(CTest)
set(CMAKE_C_STANDARD 90)
add_library(ink lib.c include/ink.h)
@ -26,6 +28,20 @@ add_executable(ink_exe main.c)
target_link_libraries(ink_exe PUBLIC ink)
target_include_directories(ink PUBLIC include)
# Functional tests
function(add_success_compiled_test cfile success_regex)
add_executable(${cfile} test/${cfile}.c)
target_link_libraries(${cfile} PUBLIC ink)
add_test(NAME ${cfile} COMMAND ${cfile})
set_property (TEST ${cfile}
PROPERTY PASS_REGULAR_EXPRESSION "${success_regex}")
endfunction()
add_success_compiled_test(sequence_of_20s "[20]+")
add_success_compiled_test(macro_optimized "1000")
add_success_compiled_test(array_shenanigans "Hello World\n\\[ 104 2 9 9 12 64 119 12 15 9 1 42 \\]\n")
if(MSVC)
target_compile_options(ink PRIVATE /W4 /WX)
else()

+ 116
- 0
test/array_shenanigans.c Ver arquivo

@ -0,0 +1,116 @@
#include "ink.h"
int main(int argc, char** argv) {
struct context* ctx;
ctx = ink_make_default_context();
ink_compile(
ctx,
"fn encrypt do\n"
" 3 pluck array.size\n"
" # array add_key modulo_key index\n"
" loop:\n"
" 1 - dup 5 pluck\n"
" # array add_key modulo_key index index array\n"
" array.index \n"
" # array add_key modulo_key index v\n"
" 4 pluck +\n"
" # array add_key modulo_key index (v + add_key)\n"
" 3 pluck %\n"
" # array add_key modulo_key index ((v + add_key) % modulo_key)\n"
" 2 pluck\n"
" # array add_key modulo_key index ((v + add_key) % modulo_key) index\n"
" 6 pluck\n"
" # array add_key modulo_key index ((v + add_key) % modulo_key) index array\n"
" array.set\n"
" # array add_key modulo_key index\n"
" dup 0 != loop jump_if drop drop drop drop\n"
"end\n"
"fn string.dump do\n"
" dup array.size 0\n"
" # array end it\n"
" 91 print_utf8\n"
" 32 print_utf8\n"
" loop:\n"
" dup\n"
" # array end it it\n"
" 4 pluck\n"
" # array end it it array\n"
" array.index print_int\n"
" 32 print_utf8\n"
" 1 +\n"
" # array end it\n"
" 2 pluck 2 pluck > loop jump_if\n"
" # array end it\n"
" 93 print_utf8\n"
" drop drop drop\n"
"end\n"
"fn string.print do\n"
" dup array.size 0\n"
" # array end it\n"
" loop:\n"
" dup\n"
" # array end it it\n"
" 4 pluck\n"
" # array end it it array\n"
" array.index print_utf8\n"
" 1 +\n"
" # array end it\n"
" 2 pluck 2 pluck > loop jump_if\n"
" # array end it\n"
" drop drop drop\n"
"end"
);
ink_compile(
ctx,
"# Clones an array, creating a new array\n"
"#\n"
"# @param array The array to clone into a new array\n"
"# @return a new array that contains the same elements as the source array\n"
"#\n"
"# array -> new_array\n"
"fn array.clone do\n"
" array.new 2 pluck array.size 0\n"
" # array new_array end it\n"
" 2 pluck 2 pluck == l jump_if\n"
" # array new_array end it\n"
" loop:\n"
" dup 5 pluck\n"
" # array new_array end it it array\n"
" array.index 4 pluck\n"
" # array new_array end it v new_array\n"
" array.push\n"
" # array new_array end it\n"
" 1 +\n"
" 2 pluck 2 pluck > loop jump_if\n"
" l: drop drop swap drop\n"
" # new_array\n"
"end"
);
ink_compile(
ctx,
"[ 72 101 108 108 111 32 87 111 114 108 100 10 ] dup dup dup string.print\n"
"32 131 encrypt string.dump\n"
);
//ctx->routines[coro].panic = 0;
int increment = 1 << 16;
int counter = increment;
int c;
while(ink_can_run(ctx)) {
for(c = 0; c < 64; ++c)
ink_step_everyone(ctx);
if(ctx->steps < counter) {
ink_gc(ctx);
counter += increment;
}
}
//return ctx->routines[coro].panic != INK_ROUTINE_SUCCESS && ctx->routines[coro].panic != INK_ROUTINE_CAN_REUSE;
}

+ 50
- 0
test/macro_optimized.c Ver arquivo

@ -0,0 +1,50 @@
#include "ink.h"
int main(int argc, char** argv) {
struct context* ctx;
ctx = ink_make_default_context();
ink_compile(
ctx,
"macro five do 1 1 1 1 1 + + + + end"
);
ink_compile(
ctx,
"macro tens do five five + end"
);
ink_compile(
ctx,
"macro hundreds do tens tens tens tens tens tens tens tens tens tens + + + + + + + + + end"
);
ink_compile(
ctx,
"macro thousand do hundreds hundreds hundreds hundreds hundreds hundreds hundreds hundreds hundreds hundreds + + + + + + + + + end"
);
int coro = ink_compile(
ctx,
"thousand thousand * thousand / thousand thousand * thousand / thousand / * print_int"
);
ctx->routines[coro].panic = 0;
int increment = 1 << 16;
int counter = increment;
int c;
while(ink_can_run(ctx)) {
for(c = 0; c < 16; ++c)
ink_step_everyone(ctx);
if(ctx->steps < counter) {
ink_gc(ctx);
counter += increment;
}
}
return (ctx->routines[coro].panic != INK_ROUTINE_SUCCESS && ctx->routines[coro].panic != INK_ROUTINE_CAN_REUSE) || ctx->steps > 1000;
}

+ 33
- 0
test/sequence_of_20s.c Ver arquivo

@ -0,0 +1,33 @@
#include "ink.h"
int main(int argc, char** argv) {
struct context* ctx;
ctx = ink_make_default_context();
int coro = ink_compile(
ctx,
"20 print_int 10 10 + print_int 2 10 * print_int 5 5 5 * swap - print_int 60 3 / print_int\n"
"5 1 1 1 1 + + + * print_int\n"
"2 2 9 * + print_int\n"
"20 -1 80 10 10 * - * print_int print_int"
);
ctx->routines[coro].panic = 0;
int increment = 1 << 16;
int counter = increment;
int c;
while(ink_can_run(ctx)) {
for(c = 0; c < 64; ++c)
ink_step_everyone(ctx);
if(ctx->steps < counter) {
ink_gc(ctx);
counter += increment;
}
}
return ctx->routines[coro].panic != INK_ROUTINE_SUCCESS && ctx->routines[coro].panic != INK_ROUTINE_CAN_REUSE;
}

Carregando…
Cancelar
Salvar