From: DeaDDooMER Date: Sun, 13 Aug 2017 16:55:51 +0000 (+0300) Subject: Добавлены тесты экспорта X-Git-Url: http://deadsoftware.ru/gitweb?a=commitdiff_plain;h=757bfb90589d07922991e34a4cc36ef434c8e3bb;p=dsw-obn.git Добавлены тесты экспорта --- diff --git a/Test17A.obn b/Test17A.obn new file mode 100644 index 0000000..8b823e0 --- /dev/null +++ b/Test17A.obn @@ -0,0 +1,12 @@ +MODULE Test17A; + +IMPORT C := Test17Common; + +BEGIN + C.rec.fldRW := 666; + С.p.fldRW := 666; + С.arr[0] := 666; + С.pa[0] := 666; +END Test17A. + +Тест экспорта. Копиляция должна проваливаться. Переменные не экспортированы. diff --git a/Test17B.obn b/Test17B.obn new file mode 100644 index 0000000..dc7a3d1 --- /dev/null +++ b/Test17B.obn @@ -0,0 +1,11 @@ +MODULE Test17B; + +IMPORT C := Test17Common; + +BEGIN + C.recRO.fldRW := 666; +END Test17B. + +Тест экспорта на чтение. Компиляция должна проваливаться. +Переменные-статические-записи экспортированные только для чтения, +но с полями допускающие запись - все равно должны быть только для чтения. diff --git a/Test17C.obn b/Test17C.obn new file mode 100644 index 0000000..35d89b0 --- /dev/null +++ b/Test17C.obn @@ -0,0 +1,11 @@ +MODULE Test17C; + +IMPORT C := Test17Common; + +BEGIN + C.pRO.fldRW := 666; +END Test17C. + +Тест экспорта на чтение. Компиляция должна быть успешна. +Переменные-указатели экспортированные только для чтения должны допускать +запись в структуру по указателю, но запрещать изменение самого указателя. diff --git a/Test17Common.obn b/Test17Common.obn new file mode 100644 index 0000000..734d7b0 --- /dev/null +++ b/Test17Common.obn @@ -0,0 +1,15 @@ +MODULE Test17Common; + +TYPE + PRec = POINTER TO RecDesc; + RecDesc = RECORD fld, fldRO-, fldRW* : INTEGER END; + PArr = POINTER TO Arr; + Arr = ARRAY 3 OF INTEGER; + +VAR + rec, recRO-, recRW* : RecDesc; + p, pRO-, pRW* : PRec; + arr, arrRO-, arrRW* : Arr; + pa, paRO-, paRW* : PArr; + +END Test17Common. diff --git a/Test17D.obn b/Test17D.obn new file mode 100644 index 0000000..965bb47 --- /dev/null +++ b/Test17D.obn @@ -0,0 +1,10 @@ +MODULE Test17D; + +IMPORT C := Test17Common; + +BEGIN + C.recRW.fldRW := 666; + C.pRW.fldRW := 666; +END Test17D. + +Тест экспорта на запись. Компиляция должна быть успешна. diff --git a/Test17E.obn b/Test17E.obn new file mode 100644 index 0000000..b28c97f --- /dev/null +++ b/Test17E.obn @@ -0,0 +1,10 @@ +MODULE Test17E; + +IMPORT C := Test17Common; + +BEGIN + C.recRW.fld := 666; + C.pRW.fld := 666; +END Test17E. + +Тест экспорта. Копиляция должна проваливаться т.к. поля не экспортированы. diff --git a/Test17F.obn b/Test17F.obn new file mode 100644 index 0000000..b8a45f2 --- /dev/null +++ b/Test17F.obn @@ -0,0 +1,10 @@ +MODULE Test17F; + +IMPORT C := Test17Common; + +BEGIN + C.recRW.fldRO := 666; + C.pRW.fldRO := 666; +END Test17F. + +Тест экспорта. Копиляция должна проваливаться т.к. поля только для чтения. diff --git a/notes b/notes index b09a685..191dfc9 100644 --- a/notes +++ b/notes @@ -22,12 +22,11 @@ 1.2.6 Module Strings 1.2.7 Module Math and MathL -- Уточнить как должна работать проверка импорта на чтение. (8.1) - Примеры -5 DIV 3 и -5 MOD 3 работают не так как в (8.2.2) Нужен другой тип округления? - Нет модуля SYSTEM (на жабе он особо и не нужен) -- Нужны средства создания биндингов. На данный момент реализуемо как заглушки для модулей. +- Нужны средства создания биндингов. На данный момент реализуемо как пустые модули. - Любая ошибка фатальна - Нет проверок переполнения в компилтайме. Возможно можно заюзать это: diff --git a/obn-run-tests.sh b/obn-run-tests.sh index 62fc967..e3e3d5a 100755 --- a/obn-run-tests.sh +++ b/obn-run-tests.sh @@ -2,20 +2,27 @@ set -e +# Тест: компиляция и исполнение maketest() { local OK=1 local LOG="" if ! LOG="$(./obn-compile.sh $1)"; then OK=0; + echo "==============================" + echo "Test fail: $1 compile-time $?:" echo "$LOG" - echo "Test fail: $1 compile-time $?" + echo "==============================" + echo fi if [ $OK = 1 ]; then if ! ./obn-run.sh $1; then OK=0 + echo "==============================" + echo "Test fail: $1 run-time $?:" echo "$LOG" - echo "Test fail: $1 run-time $?" + echo "==============================" + echo fi fi if [ $OK = 1 ]; then @@ -23,13 +30,35 @@ maketest() fi } -compile_false_positive() +# Тест: только компиляция +makecomp() { - if ./obn-compile.sh $1; then - echo "Test fail: $1 compile-time $?" + local LOG="" + if ! LOG="$(./obn-compile.sh $1)"; then + echo "==============================" + echo "Test fail: $1 compile-time $?:" + echo "$LOG" + echo "==============================" + echo else echo "Test ok: $1" fi + +} + +# Тест: Компиляция не должна проходить +makefail() +{ + local LOG="" + if ! LOG="$(./obn-compile.sh $1)"; then + echo "Test ok: $1" + else + echo "==============================" + echo "Test fail: $1 compile-time $?:" + echo "$LOG" + echo "==============================" + echo + fi } ./make.sh jvm @@ -50,3 +79,10 @@ maketest Test13 maketest Test14 maketest Test15 maketest Test16 +makefail Test17A +makefail Test17B +makecomp Test17C +makecomp Test17D +makefail Test17E +makefail Test17F + diff --git a/src/oberon-common.c b/src/oberon-common.c index f1b6711..01f2c9e 100644 --- a/src/oberon-common.c +++ b/src/oberon-common.c @@ -11,12 +11,12 @@ oberon_error(oberon_context_t * ctx, const char * fmt, ...) { va_list ptr; va_start(ptr, fmt); - fprintf(stderr, "error: "); - vfprintf(stderr, fmt, ptr); - fprintf(stderr, "\n"); - fprintf(stderr, " code_index = %i\n", ctx -> code_index); - fprintf(stderr, " c = %c\n", ctx -> c); - fprintf(stderr, " token = %i\n", ctx -> token); + printf("error: "); + vprintf(fmt, ptr); + printf("\n"); + printf(" code_index = %i\n", ctx -> code_index); + printf(" c = %c\n", ctx -> c); + printf(" token = %i\n", ctx -> token); va_end(ptr); exit(1); } diff --git a/src/oberon.c b/src/oberon.c index 830844a..efa6fed 100644 --- a/src/oberon.c +++ b/src/oberon.c @@ -1248,7 +1248,7 @@ oberno_make_dereferencing(oberon_context_t * ctx, oberon_expr_t * expr) assert(expr -> is_item); oberon_expr_t * selector; - selector = oberon_new_item(MODE_DEREF, expr -> result -> base, expr -> read_only); + selector = oberon_new_item(MODE_DEREF, expr -> result -> base, false); selector -> item.parent = (oberon_item_t *) expr; return selector;