summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorMarius Kintel <marius@kintel.net>2013-12-11 07:50:52 (GMT)
committerMarius Kintel <marius@kintel.net>2013-12-11 07:50:52 (GMT)
commit6987ac927907bd2440abd8336cf6fa095a984bab (patch)
treead119a79974ae6f875dffd0801154617755ee59c /tests
parentd14f0be01c06a872a7fb0cef6e0fa67ad7bc4a4f (diff)
parent509a466ddd903906d290e30e98e5b6b01359b2f4 (diff)
Merge pull request #561 from brodykenrick/master
Unicode support for search, length and STRING[] accesses (+ a fix for 3rd Party CGAL lib issue on Ubunti)
Diffstat (limited to 'tests')
-rw-r--r--tests/CMakeLists.txt42
-rw-r--r--tests/FindGLIB2.cmake28
-rw-r--r--tests/regression/echotest/search-tests-unicode-expected.echo109
-rw-r--r--tests/regression/echotest/string-unicode-expected.echo107
4 files changed, 280 insertions, 6 deletions
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 370c8be..d76f498 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -366,10 +366,10 @@ if (NOT $ENV{CGALDIR} STREQUAL "")
elseif (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "")
if (EXISTS "$ENV{OPENSCAD_LIBRARIES}/lib/CGAL")
set(CGAL_DIR "$ENV{OPENSCAD_LIBRARIES}/lib/CGAL")
- set(CMAKE_MODULE_PATH "${CGAL_DIR}")
+ set(CMAKE_MODULE_PATH "${CGAL_DIR}" ${CMAKE_MODULE_PATH})
elseif (EXISTS "$ENV{OPENSCAD_LIBRARIES}/include/CGAL")
set(CGAL_DIR "$ENV{OPENSCAD_LIBRARIES}")
- set(CMAKE_MODULE_PATH "${CGAL_DIR}")
+ set(CMAKE_MODULE_PATH "${CGAL_DIR}" ${CMAKE_MODULE_PATH})
endif()
endif()
message(STATUS "CGAL_DIR: " ${CGAL_DIR})
@@ -383,12 +383,40 @@ if("${CGAL_MAJOR_VERSION}.${CGAL_MINOR_VERSION}" VERSION_LESS 3.6)
message(FATAL_ERROR "CGAL >= 3.6 required")
endif()
inclusion(CGAL_DIR CGAL_INCLUDE_DIRS)
+#Remove bad BOOST libraries from CGAL 3rd party dependencies when they don't exist (such as on 64-bit Ubuntu 13.10).
+#Libs of concern are /usr/lib/libboost_thread.so;/usr/lib/libboost_system.so;
+#Confirmed bug in CGAL @ https://bugs.launchpad.net/ubuntu/+source/cgal/+bug/1242111
+string(FIND "${CGAL_3RD_PARTY_LIBRARIES}" "/usr/lib/libboost_system.so" FIND_POSITION )
+if(NOT "-1" STREQUAL ${FIND_POSITION} )
+ if(NOT EXISTS "/usr/lib/libboost_system.so")
+ MESSAGE( STATUS "CGAL_3RD_PARTY_LIBRARIES:Removing non-existent /usr/lib/libboost_system.so" )
+ string(REPLACE "/usr/lib/libboost_system.so" "" CGAL_3RD_PARTY_LIBRARIES ${CGAL_3RD_PARTY_LIBRARIES})
+ endif()
+endif()
+string(FIND "${CGAL_3RD_PARTY_LIBRARIES}" "/usr/lib/libboost_thread.so" FIND_POSITION )
+if(NOT "-1" STREQUAL ${FIND_POSITION} )
+ if(NOT EXISTS "/usr/lib/libboost_thread.so")
+ MESSAGE( STATUS "CGAL_3RD_PARTY_LIBRARIES:Removing non-existent /usr/lib/libboost_thread.so" )
+ string(REPLACE "/usr/lib/libboost_thread.so" "" CGAL_3RD_PARTY_LIBRARIES ${CGAL_3RD_PARTY_LIBRARIES})
+ endif()
+endif()
if(${CMAKE_CXX_COMPILER} MATCHES ".*clang.*" AND NOT ${CGAL_CXX_FLAGS_INIT} STREQUAL "" )
string(REPLACE "-frounding-math" "" CGAL_CXX_FLAGS_INIT ${CGAL_CXX_FLAGS_INIT})
string(REPLACE "--param=ssp-buffer-size=4" "" CGAL_CXX_FLAGS_INIT ${CGAL_CXX_FLAGS_INIT})
endif()
+if (NOT $ENV{OPENSCAD_LIBRARIES} STREQUAL "")
+ # Force pkg-config to look _only_ in the local library folder
+ # in case OPENSCAD_LIBRARIES is set.
+ set(ENV{PKG_CONFIG_PATH} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig")
+ set(ENV{PKG_CONFIG_LIBDIR} "$ENV{OPENSCAD_LIBRARIES}/lib/pkgconfig")
+endif()
+
+find_package(GLIB2 2.2.0 REQUIRED)
+add_definitions(${GLIB2_DEFINITIONS})
+inclusion(GLIB2_DIR GLIB2_INCLUDE_DIRS)
+
# Imagemagick
if (SKIP_IMAGEMAGICK)
@@ -560,8 +588,8 @@ set(OFFSCREEN_SOURCES
../src/OpenCSGRenderer.cc)
add_library(tests-core STATIC ${CORE_SOURCES})
-target_link_libraries(tests-core ${OPENGL_LIBRARIES})
-set(TESTS-CORE-LIBRARIES ${OPENGL_LIBRARIES} ${Boost_LIBRARIES})
+target_link_libraries(tests-core ${OPENGL_LIBRARIES} ${GLIB2_LIBRARIES} )
+set(TESTS-CORE-LIBRARIES ${OPENGL_LIBRARIES} ${GLIB2_LIBRARIES} ${Boost_LIBRARIES} )
add_library(tests-common STATIC ${COMMON_SOURCES})
target_link_libraries(tests-common tests-core)
@@ -581,7 +609,7 @@ set(TESTS-NOCGAL-LIBRARIES ${TESTS-CORE-LIBRARIES})
# modulecachetest
#
add_executable(modulecachetest modulecachetest.cc)
-target_link_libraries(modulecachetest tests-nocgal ${TESTS-NOCGAL-LIBRARIES} ${Boost_LIBRARIES})
+target_link_libraries(modulecachetest tests-nocgal ${TESTS-NOCGAL-LIBRARIES})
#
# csgtexttest
@@ -601,7 +629,7 @@ target_link_libraries(cgalcachetest tests-cgal ${TESTS-CGAL-LIBRARIES} ${GLEW_LI
#
add_executable(openscad_nogui ../src/openscad.cc)
set_target_properties(openscad_nogui PROPERTIES COMPILE_FLAGS "-fno-strict-aliasing -DEIGEN_DONT_ALIGN -DENABLE_CGAL -DENABLE_OPENCSG ${CGAL_CXX_FLAGS_INIT}")
-target_link_libraries(openscad_nogui tests-offscreen tests-cgal tests-nocgal ${TESTS-CORE-LIBRARIES} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${Boost_LIBRARIES} ${OPENCSG_LIBRARY} ${COCOA_LIBRARY} )
+target_link_libraries(openscad_nogui tests-offscreen tests-cgal tests-nocgal ${TESTS-CORE-LIBRARIES} ${TESTS-CGAL-LIBRARIES} ${GLEW_LIBRARY} ${OPENCSG_LIBRARY} ${COCOA_LIBRARY} )
#
# GUI binary tests
@@ -781,8 +809,10 @@ list(APPEND ECHO_FILES ${FUNCTION_FILES}
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/dim-all.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-test.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-indexing.scad
+ ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/string-unicode.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/vector-values.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/search-tests.scad
+ ${CMAKE_SOURCE_DIR}/../testdata/scad/misc/search-tests-unicode.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/recursion-tests.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/value-reassignment-tests.scad
${CMAKE_SOURCE_DIR}/../testdata/scad/misc/value-reassignment-tests2.scad
diff --git a/tests/FindGLIB2.cmake b/tests/FindGLIB2.cmake
new file mode 100644
index 0000000..9164c39
--- /dev/null
+++ b/tests/FindGLIB2.cmake
@@ -0,0 +1,28 @@
+find_package(PkgConfig REQUIRED)
+
+pkg_search_module(GLIB2 REQUIRED glib-2.0)
+#message("GLIB2_LIBRARIES ${GLIB2_LIBRARIES}")
+message("GLIB2_LIBRARY_DIRS ${GLIB2_LIBRARY_DIRS}")
+#message("GLIB2_LDFLAGS ${GLIB2_LDFLAGS}")
+#message("GLIB2_LDFLAGS_OTHER ${GLIB2_LDFLAGS_OTHER}")
+message("GLIB2_INCLUDE_DIRS ${GLIB2_INCLUDE_DIRS}")
+#message("GLIB2_CFLAGS ${GLIB2_CFLAGS}")
+#message("GLIB2_CFLAGS_OTHER ${GLIB2_CFLAGS_OTHER}")
+message("GLIB2_LIBDIR ${GLIB2_LIBDIR}")
+
+set(GLIB2_DEFINITIONS ${GLIB2_CFLAGS_OTHER})
+#message("GLIB2_DEFINITIONS ${GLIB2_DEFINITIONS}")
+
+set(GLIB2_LIBRARY_NAMES ${GLIB2_LIBRARIES})
+set(GLIB2_LIBRARIES "")
+foreach(GLIB2_LIB ${GLIB2_LIBRARY_NAMES})
+# message("lib: ${GLIB2_LIB}")
+ set(TMP TMP-NOTFOUND)
+ find_library(TMP NAMES ${GLIB2_LIB}
+ PATHS ${GLIB2_LIBRARY_DIRS}
+ PATHS ${GLIB2_LIBDIR}
+ NO_DEFAULT_PATH)
+# message("TMP: ${TMP}")
+ list(APPEND GLIB2_LIBRARIES "${TMP}")
+endforeach()
+message("GLIB2_LIBRARIES: ${GLIB2_LIBRARIES}")
diff --git a/tests/regression/echotest/search-tests-unicode-expected.echo b/tests/regression/echotest/search-tests-unicode-expected.echo
new file mode 100644
index 0000000..801bc8c
--- /dev/null
+++ b/tests/regression/echotest/search-tests-unicode-expected.echo
@@ -0,0 +1,109 @@
+ECHO: "----- Lookup of 1 byte into 1 byte"
+ECHO: "Expect [0] for search(a, aaaa)=[0]. OK"
+ECHO: "Expect [0] for search(a, aaaa, 1)=[0]. OK"
+ECHO: "Expect [0, 0] for search(aa, aaaa)=[0, 0]. OK"
+ECHO: "Expect [0, 0] for search(aa, aaaa, 1)=[0, 0]. OK"
+ECHO: "Expect [[0, 1, 2, 3]] for search(a, aaaa, 0)=[[0, 1, 2, 3]]. OK"
+ECHO: "Expect [[0, 1]] for search(a, aaaa, 2)=[[0, 1]]. OK"
+ECHO: "Expect [[0, 1, 2]] for search(a, aaaa, 3)=[[0, 1, 2]]. OK"
+ECHO: "Expect [[0, 1, 2, 3]] for search(a, aaaa, 4)=[[0, 1, 2, 3]]. OK"
+ECHO: "Expect [[0, 1, 2, 3], [0, 1, 2, 3]] for search(aa, aaaa, 0)=[[0, 1, 2, 3], [0, 1, 2, 3]]. OK"
+ WARNING: search term not found: "b"
+ECHO: "Expect [] for search(b, aaaa)=[]. OK"
+ WARNING: search term not found: "b"
+ECHO: "Expect [] for search(b, aaaa, 1)=[]. OK"
+ WARNING: search term not found: "b"
+ECHO: "Expect [[]] for search(b, aaaa, 0)=[[]]. OK"
+ WARNING: search term not found: "b"
+ECHO: "Expect [[]] for search(b, aaaa, 2)=[[]]. OK"
+ WARNING: search term not found: "b"
+ WARNING: search term not found: "b"
+ECHO: "Expect [] for search(bb, aaaa)=[]. OK"
+ WARNING: search term not found: "b"
+ WARNING: search term not found: "b"
+ECHO: "Expect [] for search(bb, aaaa, 1)=[]. OK"
+ WARNING: search term not found: "b"
+ WARNING: search term not found: "b"
+ECHO: "Expect [[], []] for search(bb, aaaa, 0)=[[], []]. OK"
+ WARNING: search term not found: "b"
+ WARNING: search term not found: "b"
+ECHO: "Expect [[], []] for search(bb, aaaa, 2)=[[], []]. OK"
+ECHO: "Expect [] for search(, aaaa)=[]. OK"
+ECHO: "Expect [] for search(, )=[]. OK"
+ WARNING: search term not found: "a"
+ECHO: "Expect [] for search(a, )=[]. OK"
+ECHO: "----- Lookup of multi-byte into 1 byte"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [] for search(Π›, aaaa)=[]. OK"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [] for search(πŸ‚‘, aaaa)=[]. OK"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [[]] for search(Π›, aaaa, 0)=[[]]. OK"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [[]] for search(πŸ‚‘, aaaa, 0)=[[]]. OK"
+ WARNING: search term not found: "Π›"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [] for search(Π›Π›, aaaa)=[]. OK"
+ WARNING: search term not found: "πŸ‚‘"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [] for search(πŸ‚‘πŸ‚‘, aaaa)=[]. OK"
+ WARNING: search term not found: "Π›"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [[], []] for search(Π›Π›, aaaa, 0)=[[], []]. OK"
+ WARNING: search term not found: "πŸ‚‘"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [[], []] for search(πŸ‚‘πŸ‚‘, aaaa, 0)=[[], []]. OK"
+ECHO: "----- Lookup of 1-byte into multi-byte"
+ WARNING: search term not found: "a"
+ECHO: "Expect [] for search(a, Π›Π›Π›Π›)=[]. OK"
+ WARNING: search term not found: "a"
+ECHO: "Expect [] for search(a, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘)=[]. OK"
+ WARNING: search term not found: "a"
+ECHO: "Expect [] for search(a, Π›Π›Π›Π›, 1)=[]. OK"
+ WARNING: search term not found: "a"
+ECHO: "Expect [[]] for search(a, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘, 0)=[[]]. OK"
+ WARNING: search term not found: "a"
+ECHO: "Expect [[]] for search(a, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘, 2)=[[]]. OK"
+ECHO: "----- Lookup of 1-byte into mixed multi-byte"
+ECHO: "Expect [0] for search(a, aΠ›aΠ›aΠ›aΠ›a)=[0]. OK"
+ECHO: "Expect [0] for search(a, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a)=[0]. OK"
+ECHO: "Expect [0] for search(a, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a)=[0]. OK"
+ECHO: "Expect [[0, 2, 4, 6, 8]] for search(a, aΠ›aΠ›aΠ›aΠ›a, 0)=[[0, 2, 4, 6, 8]]. OK"
+ECHO: "Expect [[0, 2, 4, 6, 8]] for search(a, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 0)=[[0, 2, 4, 6, 8]]. OK"
+ECHO: "Expect [[0, 4, 8]] for search(a, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 0)=[[0, 4, 8]]. OK"
+ECHO: "----- Lookup of 2-byte into 2-byte"
+ECHO: "Expect [0] for search(Π›, Π›Π›Π›Π›)=[0]. OK"
+ECHO: "Expect [[0, 1, 2, 3]] for search(Π›, Π›Π›Π›Π›, 0)=[[0, 1, 2, 3]]. OK"
+ECHO: "----- Lookup of 2-byte into 4-byte"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [] for search(Π›, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘)=[]. OK"
+ECHO: "----- Lookup of 4-byte into 4-byte"
+ECHO: "Expect [0] for search(πŸ‚‘, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘)=[0]. OK"
+ECHO: "Expect [[0, 1, 2, 3]] for search(πŸ‚‘, πŸ‚‘πŸ‚‘πŸ‚‘πŸ‚‘, 0)=[[0, 1, 2, 3]]. OK"
+ECHO: "----- Lookup of 4-byte into 2-byte"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [] for search(πŸ‚‘, Π›Π›Π›Π›)=[]. OK"
+ECHO: "----- Lookup of 2-byte into mixed multi-byte"
+ECHO: "Expect [1] for search(Π›, aΠ›aΠ›aΠ›aΠ›a, 1)=[1]. OK"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [] for search(Π›, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 1)=[]. OK"
+ECHO: "Expect [2] for search(Π›, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 1)=[2]. OK"
+ECHO: "Expect [[1, 3, 5, 7]] for search(Π›, aΠ›aΠ›aΠ›aΠ›a, 0)=[[1, 3, 5, 7]]. OK"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [[]] for search(Π›, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 0)=[[]]. OK"
+ECHO: "Expect [[2, 6]] for search(Π›, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 0)=[[2, 6]]. OK"
+ECHO: "----- Lookup of 4-byte into mixed multi-byte"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [] for search(πŸ‚‘, aΠ›aΠ›aΠ›aΠ›a, 1)=[]. OK"
+ECHO: "Expect [1] for search(πŸ‚‘, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 1)=[1]. OK"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [[]] for search(πŸ‚‘, aΠ›aΠ›aΠ›aΠ›a, 0)=[[]]. OK"
+ECHO: "Expect [[1, 3, 5, 7]] for search(πŸ‚‘, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 0)=[[1, 3, 5, 7]]. OK"
+ECHO: "Expect [[1, 3, 5, 7]] for search(πŸ‚‘, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 0)=[[1, 3, 5, 7]]. OK"
+ECHO: "----- Lookup of mixed multi-byte into mixed multi-byte"
+ WARNING: search term not found: "πŸ‚‘"
+ECHO: "Expect [[0, 2, 4, 6, 8], [1, 3, 5, 7], []] for search(aΠ›πŸ‚‘, aΠ›aΠ›aΠ›aΠ›a, 0)=[[0, 2, 4, 6, 8], [1, 3, 5, 7], []]. OK"
+ WARNING: search term not found: "Π›"
+ECHO: "Expect [[0, 2, 4, 6, 8], [], [1, 3, 5, 7]] for search(aΠ›πŸ‚‘, aπŸ‚‘aπŸ‚‘aπŸ‚‘aπŸ‚‘a, 0)=[[0, 2, 4, 6, 8], [], [1, 3, 5, 7]]. OK"
+ECHO: "Expect [[0, 4, 8], [2, 6], [1, 3, 5, 7]] for search(aΠ›πŸ‚‘, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 0)=[[0, 4, 8], [2, 6], [1, 3, 5, 7]]. OK"
+ECHO: "Expect [[1, 3, 5, 7], [0, 4, 8], [2, 6]] for search(πŸ‚‘aΠ›, aπŸ‚‘Π›πŸ‚‘aπŸ‚‘Π›πŸ‚‘a, 0)=[[1, 3, 5, 7], [0, 4, 8], [2, 6]]. OK"
diff --git a/tests/regression/echotest/string-unicode-expected.echo b/tests/regression/echotest/string-unicode-expected.echo
new file mode 100644
index 0000000..a1cd3be
--- /dev/null
+++ b/tests/regression/echotest/string-unicode-expected.echo
@@ -0,0 +1,107 @@
+ECHO: "text_1bytes_len = ", "1234", " len = ", 4
+ECHO: "text_2bytes_len = ", "Π›Π›Π›Π›", " len = ", 4
+ECHO: "text_4bytes_len = ", "πŸ‚‘πŸ‚±πŸƒπŸƒ‘", " len = ", 4
+ECHO: "[", 0, "] = ", "DEADBEEF", " of len=", 8, ":"
+ECHO: " [", 0, "]=", "D"
+ECHO: " [", 1, "]=", "E"
+ECHO: " [", 2, "]=", "A"
+ECHO: " [", 3, "]=", "D"
+ECHO: " [", 4, "]=", "B"
+ECHO: " [", 5, "]=", "E"
+ECHO: " [", 6, "]=", "E"
+ECHO: " [", 7, "]=", "F"
+ECHO: "[", 1, "] = ", "Π›Π΅Π½ΠΈΠ²Ρ‹ΠΉ Ρ€Ρ‹ΠΆΠΈΠΉ ΠΊΠΎΡ‚", " of len=", 17, ":"
+ECHO: " [", 0, "]=", "Π›"
+ECHO: " [", 1, "]=", "Π΅"
+ECHO: " [", 2, "]=", "Π½"
+ECHO: " [", 3, "]=", "ΠΈ"
+ECHO: " [", 4, "]=", "Π²"
+ECHO: " [", 5, "]=", "Ρ‹"
+ECHO: " [", 6, "]=", "ΠΉ"
+ECHO: " [", 7, "]=", " "
+ECHO: " [", 8, "]=", "Ρ€"
+ECHO: " [", 9, "]=", "Ρ‹"
+ECHO: " [", 10, "]=", "ΠΆ"
+ECHO: " [", 11, "]=", "ΠΈ"
+ECHO: " [", 12, "]=", "ΠΉ"
+ECHO: " [", 13, "]=", " "
+ECHO: " [", 14, "]=", "ΠΊ"
+ECHO: " [", 15, "]=", "ΠΎ"
+ECHO: " [", 16, "]=", "Ρ‚"
+ECHO: "[", 2, "] = ", "ΩƒΨ³ΩˆΩ„ Ψ§Ω„Ψ²Ω†Ψ¬Ψ¨ΩŠΩ„ Ψ§Ω„Ω‚Ψ·", " of len=", 18, ":"
+ECHO: " [", 0, "]=", "Ωƒ"
+ECHO: " [", 1, "]=", "Ψ³"
+ECHO: " [", 2, "]=", "و"
+ECHO: " [", 3, "]=", "Ω„"
+ECHO: " [", 4, "]=", " "
+ECHO: " [", 5, "]=", "Ψ§"
+ECHO: " [", 6, "]=", "Ω„"
+ECHO: " [", 7, "]=", "Ψ²"
+ECHO: " [", 8, "]=", "Ω†"
+ECHO: " [", 9, "]=", "Ψ¬"
+ECHO: " [", 10, "]=", "Ψ¨"
+ECHO: " [", 11, "]=", "ي"
+ECHO: " [", 12, "]=", "Ω„"
+ECHO: " [", 13, "]=", " "
+ECHO: " [", 14, "]=", "Ψ§"
+ECHO: " [", 15, "]=", "Ω„"
+ECHO: " [", 16, "]=", "Ω‚"
+ECHO: " [", 17, "]=", "Ψ·"
+ECHO: "[", 3, "] = ", "ζ‡Άζƒ°ηš„ε§œθ²“", " of len=", 5, ":"
+ECHO: " [", 0, "]=", "ζ‡Ά"
+ECHO: " [", 1, "]=", "ζƒ°"
+ECHO: " [", 2, "]=", "ηš„"
+ECHO: " [", 3, "]=", "姜"
+ECHO: " [", 4, "]=", "貓"
+ECHO: "[", 4, "] = ", "Àâü Γ„Γ–Γœ ß", " of len=", 9, ":"
+ECHO: " [", 0, "]=", "Γ€"
+ECHO: " [", 1, "]=", "ΓΆ"
+ECHO: " [", 2, "]=", "ΓΌ"
+ECHO: " [", 3, "]=", " "
+ECHO: " [", 4, "]=", "Γ„"
+ECHO: " [", 5, "]=", "Γ–"
+ECHO: " [", 6, "]=", "Ü"
+ECHO: " [", 7, "]=", " "
+ECHO: " [", 8, "]=", "ß"
+ECHO: "[", 5, "] = ", "πŸ˜πŸ˜‚πŸ˜ƒπŸ˜„πŸ˜…πŸ˜†πŸ˜‡πŸ˜ˆπŸ˜‰πŸ˜ŠπŸ˜‹πŸ˜ŒπŸ˜πŸ˜ŽπŸ˜πŸ˜", " of len=", 16, ":"
+ECHO: " [", 0, "]=", "😁"
+ECHO: " [", 1, "]=", "πŸ˜‚"
+ECHO: " [", 2, "]=", "πŸ˜ƒ"
+ECHO: " [", 3, "]=", "πŸ˜„"
+ECHO: " [", 4, "]=", "πŸ˜…"
+ECHO: " [", 5, "]=", "πŸ˜†"
+ECHO: " [", 6, "]=", "πŸ˜‡"
+ECHO: " [", 7, "]=", "😈"
+ECHO: " [", 8, "]=", "πŸ˜‰"
+ECHO: " [", 9, "]=", "😊"
+ECHO: " [", 10, "]=", "πŸ˜‹"
+ECHO: " [", 11, "]=", "😌"
+ECHO: " [", 12, "]=", "😍"
+ECHO: " [", 13, "]=", "😎"
+ECHO: " [", 14, "]=", "😏"
+ECHO: " [", 15, "]=", "😐"
+ECHO: "[", 6, "] = ", "β β ‚β ƒβ „β …β †β ‡β ˆβ ‰β Šβ ‹β Œβ β Žβ ", " of len=", 15, ":"
+ECHO: " [", 0, "]=", "⠁"
+ECHO: " [", 1, "]=", "β ‚"
+ECHO: " [", 2, "]=", "β ƒ"
+ECHO: " [", 3, "]=", "β „"
+ECHO: " [", 4, "]=", "β …"
+ECHO: " [", 5, "]=", "β †"
+ECHO: " [", 6, "]=", "β ‡"
+ECHO: " [", 7, "]=", "⠈"
+ECHO: " [", 8, "]=", "β ‰"
+ECHO: " [", 9, "]=", "⠊"
+ECHO: " [", 10, "]=", "β ‹"
+ECHO: " [", 11, "]=", "⠌"
+ECHO: " [", 12, "]=", "⠍"
+ECHO: " [", 13, "]=", "⠎"
+ECHO: " [", 14, "]=", "⠏"
+ECHO: "[", 7, "] = ", "πŸ‚‘πŸ‚±πŸƒπŸƒ‘", " of len=", 4, ":"
+ECHO: " [", 0, "]=", "πŸ‚‘"
+ECHO: " [", 1, "]=", "πŸ‚±"
+ECHO: " [", 2, "]=", "πŸƒ"
+ECHO: " [", 3, "]=", "πŸƒ‘"
+ECHO: "Past end of unicode only 2-byte ", undef
+ECHO: "Past end of unicode only 4-byte ", undef
+ECHO: "Past end of both 2-byte ", undef
+ECHO: "Past end of both 4-byte ", undef
contact: Jan Huwald // Impressum