--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/Makefile Sun Feb 13 20:59:42 2022 +0100
@@ -0,0 +1,160 @@
+#! gmake
+
+# beremiz/tests/Makefile :
+#
+# Makefile to prepare and run Beremiz tests.
+#
+# For developper to:
+# - quickly run a test (TDD) on current code
+# - write new tests, debug existing tests
+#
+# Use cases :
+#
+# run given tests
+# $ make run_python_exemple.sikuli
+#
+# run tests from particular test classes
+# $ make ide_tests
+#
+# run one particular test in a Xnest window
+# $ make xnest_run_python_exemple.sikuli
+#
+# run Xnest window with just xterm
+# $ make xnest_xterm
+#
+# run Xnest window with sikuli IDE and xterm
+# $ make xnest_xterm
+#
+# build minimal beremiz and matiec to run tests
+# $ make own_apps
+#
+# For CI/CD scripts to catch and report all failures. Use cases :
+#
+# run all tests
+# $ make
+#
+#
+# Variable $(src) is directory such that executed
+# $(src)/beremiz/tests/Makefile is this file.
+#
+# Test results, and other test byproducts are in $(test_dir),
+# $(test_dir) defaults to $(HOME)/test and can be overloaded:
+# $ make test_dir=${HOME}/other_test_dir
+#
+#
+# Matiec and Beremiz code are expected to be clean as if after hg clean --all.
+# Any change in Matiec directory triggers rebuild of matiec.
+# Any change in Matiec and Beremiz directory triggers copy of source code
+# to $(test_dir)/build.
+#
+#
+# Please note:
+# In order to run asside a freshly build Matiec, tested beremiz instance
+# needs to run on code from $(test_dir)/build/beremiz, a fresh copy
+# of the Beremiz directory $(src)/beremiz, where we run tests from.
+#
+
+all: source_check cli_tests ide_tests runtime_tests
+
+src := $(abspath $(dir $(lastword $(MAKEFILE_LIST))))
+workspace ?= $(abspath $(src)/../..)
+
+test_dir ?= $(HOME)/test
+build_dir = $(test_dir)/build
+
+OWN_PROJECTS=beremiz matiec
+
+# sha1 checksum of source is used to force copy/compile on each change
+
+define make_checksum_assign
+$(1)_checksum = $(shell tar --exclude=.hg --exclude=.git --exclude=.*.swp -c $(workspace)/$(1) | sha1sum | cut -d ' ' -f 1)
+endef
+$(foreach project,$(OWN_PROJECTS),$(eval $(call make_checksum_assign,$(project))))
+
+$(build_dir):
+ mkdir -p $(build_dir)
+
+define make_src_rule
+$(build_dir)/$(1)/$($(1)_checksum).sha1: $(build_dir) $(workspace)/$(1)
+ rm -rf $(build_dir)/$(1)
+ cp -a $(workspace)/$(1) $(build_dir)/$(1)
+ touch $$@
+endef
+$(foreach project,$(OWN_PROJECTS),$(eval $(call make_src_rule,$(project))))
+
+$(build_dir)/matiec/iec2c: | $(build_dir)/matiec/$(matiec_checksum).sha1
+ cd $(build_dir)/matiec && \
+ autoreconf -i && \
+ ./configure && \
+ make
+
+# TODO: use packge (deb/snap ?)
+own_apps: $(build_dir)/matiec/iec2c $(build_dir)/beremiz/$(beremiz_checksum).sha1
+ touch $@
+
+ide_tests = $(subst $(src)/ide_tests/,,$(wildcard $(src)/ide_tests/*.sikuli))
+
+define idetest_command
+ (fluxbox &); BEREMIZPATH=$(build_dir)/beremiz sikulix -r $(src)/ide_tests/$(1) | tee test_stdout.txt; exit $$$${pipestatus[0]}
+endef
+
+# Xnest based interactive sessions for tests edit and debug.
+# Would be nice with something equivalent to xvfb-run, waiting for USR1.
+# Arbitrary "sleep 1" is probably enough for interactive use
+define xnest_run
+ Xnest :42 -geometry 1920x1080+0+0 & export xnestpid=$$!; sleep 1; DISPLAY=:42 $(1); export res=$$?; kill $${xnestpid} 2>/dev/null; exit $${res}
+endef
+
+# Manually invoked rule {testname}.sikuli
+define make_idetest_rule
+$(test_dir)/$(1)_idetest/.passed: own_apps
+ rm -rf $(test_dir)/$(1)_idetest
+ mkdir $(test_dir)/$(1)_idetest
+ cd $(test_dir)/$(1)_idetest; xvfb-run -s '-screen 0 1920x1080x24' bash -c '$$(call idetest_command, $(1))'
+ touch $$@
+
+$(1): $(test_dir)/$(1)_idetest/.passed
+
+# Manually invoked rule xnest_{testname}.sikuli
+# runs test in xnest so that one can see what happens
+# depends on docker arguments "-v /tmp/.X11-unix/X0:/tmp/.X11-unix/X0 -e DISPLAY=$DISPLAY"
+xnest_$(1): own_apps
+ rm -rf $(test_dir)/$(1)_idetest
+ mkdir $(test_dir)/$(1)_idetest
+ cd $(test_dir)/$(1)_idetest; $$(call xnest_run, bash -c '$(call idetest_command, $(1))')
+
+ide_tests_targets += $(test_dir)/$(1)_idetest/.passed
+endef
+$(foreach idetest,$(ide_tests),$(eval $(call make_idetest_rule,$(idetest))))
+
+ide_tests : $(ide_tests_targets)
+ echo "$(ide_tests_targets)" : Passed
+
+xnest_xterm: own_apps
+ $(call xnest_run, bash -c '(fluxbox &);xterm')
+
+xnest_sikuli: own_apps
+ $(call xnest_run, bash -c '(fluxbox &);(xterm -e sikulix &);xterm')
+
+
+# in case VNC would be used
+ #xvfb-run -s '-screen 0 1920x1080x24' bash -c '(fluxbox &);(x11vnc &);xterm;'
+
+
+clean:
+ rm -rf $(ide_tests_targets) $(build_dir)
+
+
+# TODOs
+
+source_check:
+ echo TODO $@
+
+cli_tests :
+ echo TODO $@
+
+runtime_tests:
+ echo TODO $@
+
+
+