Wildcard possible targets and document

Test application names and function file names can be constructed
based on the followed naming convention. This commit documents the
naming convention and removes explicit listing of the test
executables and the lookup table for finding .function file.
diff --git a/tests/Makefile b/tests/Makefile
index 003d71c..4d2edd4 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -53,126 +53,14 @@
 LOCAL_LDFLAGS += -lz
 endif
 
-APPS =	test_suite_aes.ecb		test_suite_aes.cbc		\
-	test_suite_aes.cfb		test_suite_aes.ofb		\
-	test_suite_aes.xts						\
-	test_suite_aes.rest		test_suite_arc4			\
-	test_suite_aria			test_suite_asn1write		\
-	test_suite_base64		test_suite_blowfish		\
-	test_suite_camellia		test_suite_ccm			\
-	test_suite_chacha20		test_suite_chachapoly		\
-	test_suite_aria							\
-	test_suite_cmac							\
-	test_suite_cipher.aes						\
-	test_suite_cipher.arc4		test_suite_cipher.ccm		\
-	test_suite_cipher.chacha20					\
-	test_suite_cipher.gcm						\
-	test_suite_cipher.blowfish					\
-	test_suite_cipher.camellia					\
-	test_suite_cipher.des		test_suite_cipher.null		\
-	test_suite_cipher.padding					\
-	test_suite_ctr_drbg		test_suite_debug		\
-	test_suite_des			test_suite_dhm			\
-	test_suite_ecdh			test_suite_ecdsa		\
-	test_suite_ecjpake		test_suite_ecp			\
-	test_suite_error		test_suite_entropy		\
-	test_suite_gcm.aes128_de					\
-	test_suite_gcm.aes192_de					\
-	test_suite_gcm.aes256_de					\
-	test_suite_gcm.aes128_en					\
-	test_suite_gcm.aes192_en					\
-	test_suite_gcm.aes256_en					\
-	test_suite_gcm.camellia						\
-	test_suite_hkdf							\
-	test_suite_hmac_drbg.misc					\
-	test_suite_hmac_drbg.no_reseed					\
-	test_suite_hmac_drbg.nopr					\
-	test_suite_hmac_drbg.pr						\
-	test_suite_md			test_suite_mdx			\
-	test_suite_memory_buffer_alloc					\
-	test_suite_mpi							\
-	test_suite_pem			test_suite_pkcs1_v15		\
-	test_suite_pkcs1_v21		test_suite_pkcs5		\
-	test_suite_pkparse		test_suite_pkwrite		\
-	test_suite_pk							\
-	test_suite_rsa			test_suite_shax			\
-	test_suite_ssl			test_suite_timing		\
-	test_suite_x509parse		test_suite_x509write		\
-	test_suite_xtea			test_suite_version
+# A test application is built for each suites/test_suite_*.data file.
+# Application name is same as .data file's base name and can be
+# constructed by stripping path 'suites/' and extension .data.
+APPS = $(basename $(subst suites/,,$(wildcard suites/test_suite_*.data)))
 
+# Construct executable name by adding OS specific suffix $(EXEXT).
 BINARIES := $(addsuffix $(EXEXT),$(APPS))
 
-# Look up for associated function files
-func.test_suite_aes.ecb := test_suite_aes
-func.test_suite_aes.cbc := test_suite_aes
-func.test_suite_aes.cfb := test_suite_aes
-func.test_suite_aes.ofb := test_suite_aes
-func.test_suite_aes.xts := test_suite_aes
-func.test_suite_aes.rest := test_suite_aes
-func.test_suite_arc4 := test_suite_arc4
-func.test_suite_aria := test_suite_aria
-func.test_suite_asn1write := test_suite_asn1write
-func.test_suite_base64 := test_suite_base64
-func.test_suite_blowfish := test_suite_blowfish
-func.test_suite_camellia := test_suite_camellia
-func.test_suite_ccm := test_suite_ccm
-func.test_suite_chacha20 := test_suite_chacha20
-func.test_suite_chachapoly := test_suite_chachapoly
-func.test_suite_cmac := test_suite_cmac
-func.test_suite_cipher.chachapoly := test_suite_cipher
-func.test_suite_cipher.aes := test_suite_cipher
-func.test_suite_cipher.arc4 := test_suite_cipher
-func.test_suite_cipher.ccm := test_suite_cipher
-func.test_suite_cipher.chacha20 := test_suite_cipher
-func.test_suite_cipher.gcm := test_suite_cipher
-func.test_suite_cipher.blowfish := test_suite_cipher
-func.test_suite_cipher.camellia := test_suite_cipher
-func.test_suite_cipher.des := test_suite_cipher
-func.test_suite_cipher.null := test_suite_cipher
-func.test_suite_cipher.padding := test_suite_cipher
-func.test_suite_ctr_drbg := test_suite_ctr_drbg
-func.test_suite_debug := test_suite_debug
-func.test_suite_des := test_suite_des
-func.test_suite_dhm := test_suite_dhm
-func.test_suite_ecdh := test_suite_ecdh
-func.test_suite_ecdsa := test_suite_ecdsa
-func.test_suite_ecjpake := test_suite_ecjpake
-func.test_suite_ecp := test_suite_ecp
-func.test_suite_error := test_suite_error
-func.test_suite_entropy := test_suite_entropy
-func.test_suite_gcm.aes128_de := test_suite_gcm
-func.test_suite_gcm.aes192_de := test_suite_gcm
-func.test_suite_gcm.aes256_de := test_suite_gcm
-func.test_suite_gcm.aes128_en := test_suite_gcm
-func.test_suite_gcm.aes192_en := test_suite_gcm
-func.test_suite_gcm.aes256_en := test_suite_gcm
-func.test_suite_gcm.camellia := test_suite_gcm
-func.test_suite_hkdf := test_suite_hkdf
-func.test_suite_hmac_drbg.misc := test_suite_hmac_drbg
-func.test_suite_hmac_drbg.no_reseed := test_suite_hmac_drbg
-func.test_suite_hmac_drbg.nopr := test_suite_hmac_drbg
-func.test_suite_hmac_drbg.pr := test_suite_hmac_drbg
-func.test_suite_md := test_suite_md
-func.test_suite_mdx := test_suite_mdx
-func.test_suite_memory_buffer_alloc := test_suite_memory_buffer_alloc
-func.test_suite_mpi := test_suite_mpi
-func.test_suite_nist_kw := test_suite_nist_kw
-func.test_suite_pem := test_suite_pem
-func.test_suite_pkcs1_v15 := test_suite_pkcs1_v15
-func.test_suite_pkcs1_v21 := test_suite_pkcs1_v21
-func.test_suite_pkcs5 := test_suite_pkcs5
-func.test_suite_pkparse := test_suite_pkparse
-func.test_suite_pkwrite := test_suite_pkwrite
-func.test_suite_pk := test_suite_pk
-func.test_suite_rsa := test_suite_rsa
-func.test_suite_shax := test_suite_shax
-func.test_suite_ssl := test_suite_ssl
-func.test_suite_timing := test_suite_timing
-func.test_suite_x509parse := test_suite_x509parse
-func.test_suite_x509write := test_suite_x509write
-func.test_suite_xtea := test_suite_xtea
-func.test_suite_version := test_suite_version
-
 .SILENT:
 
 .PHONY: all check test clean
@@ -182,14 +70,26 @@
 $(DEP):
 	$(MAKE) -C ../library
 
-# invoke perl explicitly for the sake of mingw32-make
-
 C_FILES := $(addsuffix .c,$(APPS))
 
+# Wildcard target for test code generation:
+# A .c file is generated for each .data file in the suites/ directory. Each .c
+# file depends on a .data and .function file from suites/ directory. Following
+# nameing convention is followed:
+#
+#     C file        |        Depends on
+#-----------------------------------------------------------------------------
+#  foo.c            | suites/foo.function suites/foo.data
+#  foo.bar.c        | suites/foo.function suites/foo.bar.data
+#
+# Note above that .c and .data files have same base name.
+# However, corresponding .function file's base name is the word before first
+# dot in .c file's base name.
+#
 .SECONDEXPANSION:
-$(C_FILES): %.c: suites/$$(func.$$*).function suites/%.data scripts/generate_test_code.py suites/helpers.function suites/main_test.function suites/host_test.function
+%.c: suites/$$(firstword $$(subst ., ,$$*)).function suites/%.data scripts/generate_test_code.py suites/helpers.function suites/main_test.function suites/host_test.function
 	echo "  Gen   $@"
-	$(PYTHON) scripts/generate_test_code.py -f suites/$(func.$*).function \
+	$(PYTHON) scripts/generate_test_code.py -f suites/$(firstword $(subst ., ,$*)).function \
 		-d suites/$*.data \
 		-t suites/main_test.function \
 		-p suites/host_test.function \
@@ -208,8 +108,10 @@
 	rm -rf $(APPS) *.c *.datax TESTS
 else
 	del /Q /F *.c *.exe *.datax
+ifneq ($(wildcard TESTS/.*),)
 	rmdir /Q /S TESTS
 endif
+endif
 
 check: $(BINARIES)
 	perl scripts/run-test-suites.pl
@@ -222,9 +124,9 @@
 # Generate test code for target.
 
 .SECONDEXPANSION:
-$(EMBEDDED_TESTS): embedded_%: suites/$$(func.$$*).function suites/%.data scripts/generate_test_code.py suites/helpers.function suites/main_test.function suites/target_test.function
+$(EMBEDDED_TESTS): embedded_%: suites/$$(firstword $$(subst ., ,$$*)).function suites/%.data scripts/generate_test_code.py suites/helpers.function suites/main_test.function suites/target_test.function
 	echo "  Gen  ./TESTS/mbedtls/$*/$*.c"
-	$(PYTHON) scripts/generate_test_code.py -f suites/$(func.$*).function \
+	$(PYTHON) scripts/generate_test_code.py -f suites/$(firstword $(subst ., ,$*)).function \
 		-d suites/$*.data \
 		-t suites/main_test.function \
 		-p suites/target_test.function \