cmake_minimum_required(VERSION 3.10.0)
project(etl_syntax_check)

add_definitions(-DETL_DEBUG)

option(NO_STL "No STL" OFF)

if (NO_STL)
	message(STATUS "Compiling for No STL")
	add_definitions(-DETL_NO_STL)
else()
	message(STATUS "Compiling for STL")
endif()

if (ETL_USE_TYPE_TRAITS_BUILTINS)
	message(STATUS "Compiling for built-in type traits")
	add_definitions(-DETL_USE_TYPE_TRAITS_BUILTINS)
endif()

if (ETL_USER_DEFINED_TYPE_TRAITS)
	message(STATUS "Compiling for user defined type traits")
	add_definitions(-DETL_USER_DEFINED_TYPE_TRAITS)
endif()

if (ETL_FORCE_TEST_CPP03_IMPLEMENTATION)
	message(STATUS "Force C++03 implementations")
	add_definitions(-DETL_FORCE_TEST_CPP03_IMPLEMENTATION)
endif()

add_library(tests OBJECT)
target_compile_definitions(tests PRIVATE __STDC_LIMIT_MACROS __STDC_CONSTANT_MACROS __STDC_FORMAT_MACROS)
target_include_directories(tests PRIVATE "")
target_include_directories(tests SYSTEM PRIVATE ../../include)
set_target_properties(tests PROPERTIES
        CXX_STANDARD_REQUIRED ON
        CXX_EXTENSIONS ON
        )
target_compile_options(tests
	    PRIVATE
		-fsyntax-only
		)

if (ETL_CXX_STANDARD MATCHES "98")
	message(STATUS "Compiling for C++98")
    set_property(TARGET tests PROPERTY CXX_STANDARD 98)
elseif (ETL_CXX_STANDARD MATCHES "03")
	message(STATUS "Compiling for C++03 (C++98)")
	set_property(TARGET tests PROPERTY CXX_STANDARD 98)
elseif (ETL_CXX_STANDARD MATCHES "11")
	message(STATUS "Compiling for C++11")
	set_property(TARGET tests PROPERTY CXX_STANDARD 11)
elseif (ETL_CXX_STANDARD MATCHES "14")
	message(STATUS "Compiling for C++14")
	set_property(TARGET tests PROPERTY CXX_STANDARD 14)
elseif (ETL_CXX_STANDARD MATCHES "17")
	message(STATUS "Compiling for C++17")
	set_property(TARGET tests PROPERTY CXX_STANDARD 17)
elseif (ETL_CXX_STANDARD MATCHES "20")
	message(STATUS "Compiling for C++20")
	set_property(TARGET tests PROPERTY CXX_STANDARD 20)
else()
	message(STATUS "Compiling for C++23")
	set_property(TARGET tests PROPERTY CXX_STANDARD 23)
endif()

target_sources(tests PRIVATE
        etl_profile.h
		absolute.h.t.cpp
		algorithm.h.t.cpp
		alignment.h.t.cpp
		array.h.t.cpp
		array_view.h.t.cpp
		array_wrapper.h.t.cpp
		atomic.h.t.cpp
		base64.h.t.cpp
		base64_decoder.h.t.cpp
		base64_encoder.h.t.cpp
		basic_format_spec.h.t.cpp
		basic_string.h.t.cpp
		basic_string_stream.h.t.cpp
		binary.h.t.cpp
		bip_buffer_spsc_atomic.h.t.cpp
		bit.h.t.cpp
		bitset.h.t.cpp
		bit_stream.h.t.cpp
		bloom_filter.h.t.cpp
		bresenham_line.h.t.cpp
		buffer_descriptors.h.t.cpp
		byte.h.t.cpp
		byte_stream.h.t.cpp
		callback.h.t.cpp
		callback_service.h.t.cpp
		callback_timer.h.t.cpp
		callback_timer_atomic.h.t.cpp
		callback_timer_interrupt.h.t.cpp
		callback_timer_locked.h.t.cpp
		char_traits.h.t.cpp
		checksum.h.t.cpp
		chrono.h.t.cpp
		circular_buffer.h.t.cpp
		circular_iterator.h.t.cpp
		combinations.h.t.cpp
		compare.h.t.cpp
		constant.h.t.cpp
		container.h.t.cpp
		correlation.h.t.cpp
		covariance.h.t.cpp
		crc1.h.t.cpp
		crc16.h.t.cpp
		crc16_a.h.t.cpp
		crc16_arc.h.t.cpp
		crc16_aug_ccitt.h.t.cpp
		crc16_buypass.h.t.cpp
		crc16_ccitt.h.t.cpp
		crc16_cdma2000.h.t.cpp
		crc16_dds110.h.t.cpp
		crc16_dectr.h.t.cpp
		crc16_dectx.h.t.cpp
		crc16_dnp.h.t.cpp
		crc16_en13757.h.t.cpp
		crc16_genibus.h.t.cpp
		crc16_kermit.h.t.cpp
		crc16_m17.h.t.cpp
		crc16_maxim.h.t.cpp
		crc16_mcrf4xx.h.t.cpp
		crc16_modbus.h.t.cpp
		crc16_profibus.h.t.cpp
		crc16_riello.h.t.cpp
		crc16_t10dif.h.t.cpp
		crc16_teledisk.h.t.cpp
		crc16_tms37157.h.t.cpp
		crc16_usb.h.t.cpp
		crc16_x25.h.t.cpp
		crc16_xmodem.h.t.cpp
		crc32.h.t.cpp
		crc32_bzip2.h.t.cpp
		crc32_c.h.t.cpp
		crc32_d.h.t.cpp
		crc32_jamcrc.h.t.cpp
		crc32_mpeg2.h.t.cpp
		crc32_posix.h.t.cpp
		crc32_q.h.t.cpp
		crc32_xfer.h.t.cpp
		crc64_ecma.h.t.cpp
		crc8_ccitt.h.t.cpp
		crc8_cdma2000.h.t.cpp
		crc8_darc.h.t.cpp
		crc8_dvbs2.h.t.cpp
		crc8_ebu.h.t.cpp
		crc8_icode.h.t.cpp
		crc8_itu.h.t.cpp
		crc8_j1850.h.t.cpp
		crc8_j1850_zero.h.t.cpp
		crc8_maxim.h.t.cpp
		crc8_rohc.h.t.cpp
		crc8_wcdma.h.t.cpp
		cyclic_value.h.t.cpp
		debounce.h.t.cpp
		debug_count.h.t.cpp
		delegate.h.t.cpp
		delegate_service.h.t.cpp
		deque.h.t.cpp
		endianness.h.t.cpp
		enum_type.h.t.cpp
		error_handler.h.t.cpp
		exception.h.t.cpp
		expected.h.t.cpp
		factorial.h.t.cpp
		fibonacci.h.t.cpp
		file_error_numbers.h.t.cpp
		fixed_iterator.h.t.cpp
		fixed_sized_memory_block_allocator.h.t.cpp
		flags.h.t.cpp
		flat_map.h.t.cpp
		flat_multimap.h.t.cpp
		flat_multiset.h.t.cpp
		flat_set.h.t.cpp
		fnv_1.h.t.cpp
		format_spec.h.t.cpp
		forward_list.h.t.cpp
		frame_check_sequence.h.t.cpp
		fsm.h.t.cpp
		function.h.t.cpp
		functional.h.t.cpp
		function_traits.h.t.cpp
		gamma.h.t.cpp
		gcd.h.t.cpp
		generic_pool.h.t.cpp
		hash.h.t.cpp
		hfsm.h.t.cpp
		histogram.h.t.cpp
		ihash.h.t.cpp
		imemory_block_allocator.h.t.cpp
		indirect_vector.h.t.cpp
		initializer_list.h.t.cpp
		instance_count.h.t.cpp
		integral_limits.h.t.cpp
		intrusive_forward_list.h.t.cpp
		intrusive_links.h.t.cpp
		intrusive_list.h.t.cpp
		intrusive_queue.h.t.cpp
		intrusive_stack.h.t.cpp
		invert.h.t.cpp
		io_port.h.t.cpp
		ipool.h.t.cpp
		ireference_counted_message_pool.h.t.cpp
		iterator.h.t.cpp
		jenkins.h.t.cpp
		largest.h.t.cpp
		lcm.h.t.cpp
		limiter.h.t.cpp
		limits.h.t.cpp
		list.h.t.cpp
		log.h.t.cpp
		macros.h.t.cpp
		map.h.t.cpp
		math.h.t.cpp
		math_constants.h.t.cpp
		mean.h.t.cpp
		memory.h.t.cpp
		memory_model.h.t.cpp
		mem_cast.h.t.cpp
		message.h.t.cpp
		message_broker.h.t.cpp
		message_bus.h.t.cpp
		message_packet.h.t.cpp
		message_router.h.t.cpp
		message_router_registry.h.t.cpp
		message_timer.h.t.cpp
		message_timer_atomic.h.t.cpp
		message_timer_interrupt.h.t.cpp
		message_timer_locked.h.t.cpp
		message_types.h.t.cpp
		multimap.h.t.cpp
		multiset.h.t.cpp
		multi_array.h.t.cpp
		multi_range.h.t.cpp
		multi_span.h.t.cpp
		multi_vector.h.t.cpp
		murmur3.h.t.cpp
		mutex.h.t.cpp
		negative.h.t.cpp
		nth_type.h.t.cpp
		nullptr.h.t.cpp
		null_type.h.t.cpp
		numeric.h.t.cpp
		observer.h.t.cpp
		optional.h.t.cpp
		overload.h.t.cpp
		packet.h.t.cpp
		parameter_pack.h.t.cpp
		parameter_type.h.t.cpp
		pearson.h.t.cpp
		permutations.h.t.cpp
		placement_new.h.t.cpp
		platform.h.t.cpp
		poly_span.h.t.cpp
		pool.h.t.cpp
		power.h.t.cpp
		priority_queue.h.t.cpp
		pseudo_moving_average.h.t.cpp
		quantize.h.t.cpp
		queue.h.t.cpp
		queue_lockable.h.t.cpp
		queue_mpmc_mutex.h.t.cpp
		queue_spsc_atomic.h.t.cpp
		queue_spsc_isr.h.t.cpp
		queue_spsc_locked.h.t.cpp
		radix.h.t.cpp
		random.h.t.cpp
		ratio.h.t.cpp
		reference_counted_message.h.t.cpp
		reference_counted_message_pool.h.t.cpp
		reference_counted_object.h.t.cpp
		reference_flat_map.h.t.cpp
		reference_flat_multimap.h.t.cpp
		reference_flat_multiset.h.t.cpp
		reference_flat_set.h.t.cpp
		rescale.h.t.cpp
		result.h.t.cpp
		rms.h.t.cpp
		scaled_rounding.h.t.cpp
		scheduler.h.t.cpp
		set.h.t.cpp
		shared_message.h.t.cpp
		singleton.h.t.cpp
		singleton_base.h.t.cpp
		smallest.h.t.cpp
		span.h.t.cpp
		sqrt.h.t.cpp
		stack.h.t.cpp
		standard_deviation.h.t.cpp
		state_chart.h.t.cpp
		static_assert.h.t.cpp
		string.h.t.cpp
		stringify.h.t.cpp
		string_stream.h.t.cpp
		string_utilities.h.t.cpp
		string_view.h.t.cpp
		successor.h.t.cpp
		task.h.t.cpp
		threshold.h.t.cpp
		timer.h.t.cpp
		to_arithmetic.h.t.cpp
		to_string.h.t.cpp
		to_u16string.h.t.cpp
		to_u32string.h.t.cpp
		to_u8string.h.t.cpp
		to_wstring.h.t.cpp
		tuple.h.t.cpp
		type_def.h.t.cpp
		type_lookup.h.t.cpp
		type_select.h.t.cpp
		type_traits.h.t.cpp
		u16format_spec.h.t.cpp
		u16string.h.t.cpp
		u16string_stream.h.t.cpp
		u32format_spec.h.t.cpp
		u32string.h.t.cpp
		u32string_stream.h.t.cpp
		u8format_spec.h.t.cpp
		u8string.h.t.cpp
		u8string_stream.h.t.cpp
		unaligned_type.h.t.cpp
		uncopyable.h.t.cpp
		unordered_map.h.t.cpp
		unordered_multimap.h.t.cpp
		unordered_multiset.h.t.cpp
		unordered_set.h.t.cpp
		user_type.h.t.cpp
		utility.h.t.cpp
		variance.h.t.cpp
		variant.h.t.cpp
		variant_pool.h.t.cpp
		vector.h.t.cpp
		version.h.t.cpp
		visitor.h.t.cpp
		wformat_spec.h.t.cpp
		wstring.h.t.cpp
		wstring_stream.h.t.cpp
        )
