#######################################################################
# Makefile for python test-suite
#######################################################################

ifneq (,$(PY2))
  PYBIN = @PYTHON@
else
  PYBIN = @PYTHON3@
endif

LANGUAGE     = python
PYTHON       = $(PYBIN)
SCRIPTSUFFIX = _runme.py
PYCODESTYLE       = @PYCODESTYLE@
PYCODESTYLE_FLAGS = --ignore=E252,E30,E402,E501,E731,E741,W291,W391

HAVE_CXX11   = @HAVE_CXX11@
srcdir       = @srcdir@
top_srcdir   = @top_srcdir@
top_builddir = @top_builddir@

CPP_TEST_CASES += \
	callback \
	complextest \
	director_stl \
	director_wstring \
	file_test \
	iadd \
	implicittest \
	inout \
	inplaceadd \
	input \
	li_cstring \
	li_cwstring \
	li_factory \
	li_implicit \
	li_std_containers_int \
	li_std_list \
	li_std_map_member \
	li_std_multimap \
	li_std_pair_extra \
	li_std_set \
	li_std_stream \
	li_std_string_extra \
	li_std_vectora \
	li_std_vector_extra \
	li_std_wstream \
	li_std_wstring_inherit \
	primitive_types \
	python_abstractbase \
	python_annotations_c \
	python_annotations_variable_c \
	python_append \
	python_builtin \
	python_destructor_exception \
	python_director \
	python_docstring \
	python_extranative \
	python_flatstaticmethod \
	python_moduleimport \
	python_overload_simple_cast \
	python_pickle \
	python_pybuffer \
	python_pythoncode \
	python_richcompare \
	python_strict_unicode \
	python_threads \
	simutry \
	std_containers \
	swigobject \
	template_matrix \

#	li_std_carray
#	director_profile

CPP11_TEST_CASES = \
	cpp11_hash_tables \
	cpp11_shared_ptr_const \
	cpp11_shared_ptr_nullptr_in_containers \
	cpp11_shared_ptr_overload \
	cpp11_shared_ptr_template_upcast \
	cpp11_shared_ptr_upcast \
	cpp11_std_unordered_map \
	cpp11_std_unordered_multimap \
	cpp11_std_unordered_multiset \
	cpp11_std_unordered_set \

C_TEST_CASES += \
	ccomplextest \
	file_test \
	li_cstring \
	li_cwstring \
	python_nondynamic \
	python_varargs_typemap \

MULTI_CPP_TEST_CASES += \
	python_runtime_data \

include $(srcdir)/../common.mk

# Overridden variables here
LIBS         = -L.
VALGRIND_OPT += --suppressions=pythonswig.supp

# Custom tests - tests with additional commandline options
python_flatstaticmethod.cpptest: SWIGOPT += -flatstaticmethod

# Make sure just python_runtime_data_builtin.i uses the -builtin option. Note: does not use python_runtime_data.list for all steps.
python_runtime_data.multicpptest: override SWIG_FEATURES := $(filter-out -builtin,$(SWIG_FEATURES))
python_runtime_data.multicpptest: override SWIGOPT := $(filter-out -builtin,$(SWIGOPT))
python_runtime_data.multicpptest: swig_and_compile_multi_cpp = \
	$(call swig_and_compile_cpp_helper,python_runtime_data_builtin,'$(SWIGOPT) -builtin') && \
	$(call swig_and_compile_cpp_helper,python_runtime_data_nobuiltin,'$(SWIGOPT)')

# Rules for the different types of tests
%.cpptest:
	$(setup)
	+$(swig_and_compile_cpp)
	$(check_pep8)
	$(run_testcase)

%.ctest:
	$(setup)
	+$(swig_and_compile_c)
	$(check_pep8)
	$(run_testcase)

%.multicpptest:
	$(setup)
	+$(swig_and_compile_multi_cpp)
	$(check_pep8_multi_cpp)
	$(run_testcase)


# Python code style checking
ifneq (,$(PYCODESTYLE))
check_pep8 = $(COMPILETOOL) $(PYCODESTYLE) $(PYCODESTYLE_FLAGS) $(SCRIPTPREFIX)$*.py

check_pep8_multi_cpp = \
	for f in `cat $(top_srcdir)/$(EXAMPLES)/$(TEST_SUITE)/$*.list` ; do \
	  $(COMPILETOOL) $(PYCODESTYLE) $(PYCODESTYLE_FLAGS) $$f.py; \
	done
endif

# Runs the testcase. A testcase is only run if
# a file is found which has _runme.py appended after the testcase name.
run_testcase = \
	if [ -f $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX) ]; then \
	  env LD_LIBRARY_PATH=.:$$LD_LIBRARY_PATH PYTHONPATH=.:$(srcdir):$$PYTHONPATH $(RUNTOOL) $(PYTHON) $(SCRIPTDIR)/$(SCRIPTPREFIX)$*$(SCRIPTSUFFIX); \
	fi

# Clean: remove the generated .py file
%.clean:
	@rm -f $*.py

clean:
	$(MAKE) -f $(top_builddir)/$(EXAMPLES)/Makefile SRCDIR='$(SRCDIR)' python_clean
	rm -f clientdata_prop_a.py clientdata_prop_b.py import_stl_a.py import_stl_b.py
	rm -f hugemod.h hugemod_a.i hugemod_b.i hugemod_a.py hugemod_b.py hugemod_runme.py
	rm -f imports_a.py imports_b.py mod_a.py mod_b.py multi_import_a.py
	rm -f multi_import_b.py multi_import_d.py packageoption_a.py packageoption_b.py packageoption_c.py
	rm -f template_typedef_cplx2.py python_runtime_data_builtin.py python_runtime_data_nobuiltin.py

hugemod_runme = hugemod$(SCRIPTPREFIX)

hugemod:
	perl hugemod.pl $(hugemod_runme)
	$(MAKE) hugemod_a.cpptest
	$(MAKE) hugemod_b.cpptest
	sh -c "time $(PYTHON) $(hugemod_runme)"
	sh -c "time $(PYTHON) $(hugemod_runme)"
