diff --git a/test/test.sh b/test/test.sh
new file mode 100755
index 0000000..402e9f1
--- /dev/null
+++ b/test/test.sh
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+run_test_case() {
+    mkdir -p target/src
+    mkdir -p .tmp
+
+    echo "
+-----------------------------------------------------------------------------
+Running test case ${TEST_NAME}"
+
+    ldmc "${SRC_TYPE}" "${DST_TYPE}" ../morphisms/*.morphism-base 2>|.tmp/ldmc_err 1>| target/src/${TEST_NAME}.c \
+    || (echo "... error at generation:"; cat .tmp/ldmc_err; return -1);
+
+    gcc -I../morphisms/runtime/include target/src/${TEST_NAME}.c ../morphisms/runtime/src/*.c -o target/${TEST_NAME} \
+    || (echo "... error at compilation:"; return -2);
+
+
+    LEN="$(echo -n "${EXPECT}" | wc -c)"
+    RESULT="$(echo -n ${INPUT} | ./target/${TEST_NAME} 2>.tmp/target_err | head -c ${LEN})"
+
+    if [ "${RESULT}" == "${EXPECT}" ];
+    then
+        echo "... ok"
+    else
+        echo -e "... incorrect result\n"
+        cat .tmp/target_err
+        echo -e ""
+        echo -e "INPUT:\n$(echo -n "${INPUT}" | hexyl)"
+        echo -e "EXPECTED:\n$(echo -n "${EXPECT}" | hexyl)"
+        echo -e "GOT:\n$(echo -n "${RESULT}" | hexyl)"
+    fi
+
+    rm -rf .tmp
+}
+
+TEST_NAME=test-radix-convert
+SRC_TYPE="ℕ ~ <PosInt 10 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 10> ~ Char ~ Ascii ~ x86.UInt8>"
+DST_TYPE="ℕ ~ <PosInt 16 BigEndian> ~ <Seq~<ValueTerminated 0> <Digit 16> ~ Char ~ Ascii ~ x86.UInt8>"
+INPUT="255"
+EXPECT="ff"
+run_test_case
+
+TEST_NAME=test-msb-cont
+SRC_TYPE="<Seq~<ValueTerminated 0> x86.UInt8>"
+DST_TYPE="<Seq~MsbCont x86.UInt8>"
+INPUT=$(printf '\x01\x02\x03')
+EXPECT=$(printf '\x81\x82\x03')
+run_test_case
+
+TEST_NAME=test-value-sep1
+SRC_TYPE="<Seq <Seq Char~x86.UInt8>> ~ <ValueSep ':' Char~x86.UInt8> ~ <Seq~<ValueTerminated 0> Char~x86.UInt8>"
+DST_TYPE="<Seq <Seq Char~x86.UInt8>> ~ <ValueSep ',' Char~x86.UInt8> ~ <Seq~<ValueTerminated 0> Char~x86.UInt8>"
+INPUT="abc:def:hello world:test"
+EXPECT="abc,def,hello world,test"
+run_test_case
+
+TEST_NAME=test-value-sep2
+SRC_TYPE="<Seq <Seq x86.UInt8>> ~ <ValueSep ':' x86.UInt8> ~ <Seq~<ValueTerminated 0> x86.UInt8>"
+DST_TYPE="<Seq <Seq x86.UInt8>> ~ <ValueSep '\\n' x86.UInt8> ~ <Seq~<ValueTerminated 0> x86.UInt8>"
+INPUT="abc:def:hello world:test"
+EXPECT=$(echo -en "abc\ndef\nhello world\ntest")
+run_test_case
+
+TEST_NAME=test-value-sep-digit
+SRC_TYPE="<Seq <Seq <Digit 16>~Char~Ascii~x86.UInt8>> ~ <ValueSep ':' Char~Ascii~x86.UInt8> ~ <Seq~<ValueTerminated '\0'> Char~Ascii~x86.UInt8>"
+DST_TYPE="<Seq <Seq <Digit 16>~Char~Ascii~x86.UInt8>> ~ <ValueSep '.' Char~Ascii~x86.UInt8> ~ <Seq~<ValueTerminated '\0'> Char~Ascii~x86.UInt8>"
+INPUT="c0:ff:ee"
+EXPECT=$(echo -en "c0.ff.ee")
+run_test_case
+
+TEST_NAME=test-utf8-to-ascii
+SRC_TYPE="<Seq Char~Unicode> ~ UTF-8 ~ <Seq ~ <ValueTerminated 0> x86.UInt8>"
+DST_TYPE="<Seq~<ValueTerminated 0>  Char ~ Ascii ~ x86.UInt8>"
+INPUT="Hℵelαlo WΓΓΓorl⇒d"
+EXPECT="Hello World"
+run_test_case
+
+TEST_NAME=test-value-sep-posint
+SRC_TYPE="<Seq ℕ~<PosInt 16 BigEndian>~<Seq <Digit 16>~Char~Ascii~x86.UInt8>> ~ <ValueSep ':' Char~Ascii~x86.UInt8> ~ <Seq~<ValueTerminated '\0'> Char~Ascii~x86.UInt8>"
+DST_TYPE="<Seq ℕ~<PosInt 16 BigEndian>~<Seq <Digit 16>~Char~Ascii~x86.UInt8>> ~ <ValueSep '.' Char~Ascii~x86.UInt8> ~ <Seq~<ValueTerminated '\0'> Char~Ascii~x86.UInt8>"
+INPUT="c0:ff:ee"
+EXPECT=$(echo -en "c0.ff.ee")
+run_test_case