# CMake build for xerces-c
#
# Written by Roger Leigh <rleigh@codelibre.net>
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# Definitions required for building
add_definitions(
  -DHAVE_CONFIG_H=1
)

# Search the project binary dir for config.h
include_directories(
  ${PROJECT_BINARY_DIR}
  ${PROJECT_SOURCE_DIR}/src
  ${PROJECT_BINARY_DIR}/src
  ${CMAKE_CURRENT_SOURCE_DIR}
)

set(EXTRA_DIST
  src/DOM/Normalizer/expectedOutput
  src/DOM/TypeInfo/data/combined.dtd
  src/DOM/TypeInfo/data/combined.xml
  src/DOM/TypeInfo/data/combined.xsd
  src/DOM/TypeInfo/data/SecondSchema.xsd
  src/DOM/TypeInfo/data/TypeInfo.dtd
  src/DOM/TypeInfo/data/TypeInfo.xml
  src/DOM/TypeInfo/data/TypeInfo.xsd
  src/DOM/TypeInfo/data/TypeInfoJustDTD.xml
  src/DOM/TypeInfo/data/TypeInfoNoDTD.xml
  src/DOM/TypeInfo/data/TypeInfoNoDTD.xsd
  src/XSTSHarness/regression
  src/xinclude
)

macro(add_test_executable name)
  add_executable(${name} ${ARGN})
  target_link_libraries(${name} xerces-c)
  set_target_properties(${name} PROPERTIES FOLDER "Tests")
  list(APPEND test_programs ${name})
endmacro()

add_test_executable(DOMTest
  src/DOM/DOMTest/DTest.cpp
  src/DOM/DOMTest/DTest.h
)

add_test_executable(DOMMemTest
  src/DOM/DOMMemTest/DOMMemTest.cpp
)

add_test_executable(Normalizer
  src/DOM/Normalizer/Normalizer.cpp
  src/DOM/Normalizer/Normalizer.hpp
)

add_test_executable(RangeTest
  src/DOM/RangeTest/RangeTest.cpp
  )

add_test_executable(DOMTraversalTest
  src/DOM/Traversal/Traversal.cpp
)

add_test_executable(DOMTypeInfoTest
  src/DOM/TypeInfo/TypeInfo.cpp
  src/DOM/TypeInfo/TypeInfo.hpp
)

add_test_executable(EncodingTest
  src/EncodingTest/EncodingTest.cpp
)

add_test_executable(InitTermTest
  src/InitTermTest/InitTermTest.cpp
  src/InitTermTest/InitTermTest.hpp
)

add_test_executable(MemHandlerTest
  src/MemHandlerTest/MemoryMonitor.cpp
  src/MemHandlerTest/MemoryMonitor.hpp
  src/MemHandlerTest/SimpleValueHashTableOf.hpp
)

add_test_executable(NetAccessorTest
  src/NetAccessorTest/NetAccessorTest.cpp
)

# Doesn't compile under gcc4 for some reason
# dcargill says this is obsolete and we can delete it.
#add_test_executable(ParserTest
#  src/ParserTest/ParserTest.cpp
#  src/ParserTest/ParserTest.hpp
#  src/ParserTest/ParserTest_Parser.cpp
#  src/ParserTest/ParserTest_Parser.hpp
#)

if(NOT XERCES_USE_MUTEXMGR_NOTHREAD)
  add_test_executable(ThreadTest
    src/ThreadTest/ThreadTest.cpp
  )
  target_link_libraries(ThreadTest Threads::Threads)
endif()

# Fails to compile under gcc 4 (ambiguous calls to NullPointerException)
# dcargill says this is obsolete and we can delete it.
#add_test_executable(UtilTests
#  src/UtilTests/CoreTests_BitSet.cpp
#  src/UtilTests/CoreTests_CountedPointer.cpp
#  src/UtilTests/CoreTests_RefArray.cpp
#  src/UtilTests/CoreTests_RefHashTable.cpp
#  src/UtilTests/CoreTests_RefStack.cpp
#  src/UtilTests/CoreTests_RefVector.cpp
#  src/UtilTests/CoreTests_String.cpp
#  src/UtilTests/CoreTests_Transcoders.cpp
#  src/UtilTests/CoreTests_URL.cpp
#  src/UtilTests/CoreTests_ValueArray.cpp
#  src/UtilTests/CoreTests_ValueStack.cpp
#  src/UtilTests/CoreTests_ValueVector.cpp
#  src/UtilTests/CoreTestsMain.cpp
#  src/UtilTests/CoreTests.hpp
#)

add_test_executable(XSerializerTest
  src/XSerializerTest/XSerializerHandlers.cpp
  src/XSerializerTest/XSerializerHandlers.hpp
  src/XSerializerTest/XSerializerTest.cpp
  src/XSerializerTest/XSerializerTest.hpp
)

add_test_executable(XSTSHarness
  src/XSTSHarness/XSTSHarness.cpp
  src/XSTSHarness/XSTSHarness.hpp
  src/XSTSHarness/XSTSHarnessHandlers.cpp
  src/XSTSHarness/XSTSHarnessHandlers.hpp
  src/XSTSHarness/XMLHarnessHandlers.cpp
  src/XSTSHarness/XMLHarnessHandlers.hpp
)

# Fails to compile under gcc4 (values too long for long type)
add_test_executable(XSValueTest
  src/XSValueTest/XSValueTest.cpp
  src/XSValueTest/XSValueTest.hpp
)

if(XERCES_XMLCH_T STREQUAL "char16_t")
  add_test_executable(Char16Test
    src/Char16Test/Char16Test.cpp
  )
  if(MSVC)
    set_target_properties(Char16Test PROPERTIES COMPILE_FLAGS "/utf-8")
  endif()
endif()

# Run tests
include(XercesTest)

add_xerces_test(DOMTest          COMMAND DOMTest)
add_xerces_test(DOMMemTest       COMMAND DOMMemTest)
add_xerces_test(RangeTest        COMMAND RangeTest)
add_xerces_test(DOMTraversalTest COMMAND DOMTraversalTest)
add_xerces_test(XSerializerTest  COMMAND XSerializerTest EXPECT_FAIL)
add_xerces_test(XSerializerTest1 COMMAND XSerializerTest -v=never  personal.xml)
add_xerces_test(XSerializerTest2 COMMAND XSerializerTest -v=always personal.xml)
add_xerces_test(XSerializerTest3 COMMAND XSerializerTest -v=never  personal-schema.xml)
add_xerces_test(XSerializerTest4 COMMAND XSerializerTest -v=always personal-schema.xml)
add_xerces_test(XSerializerTest5 COMMAND XSerializerTest -v=always -f personal-schema.xml)
add_xerces_test(XSValueTest      COMMAND XSValueTest)

add_xerces_test(InitTermTest     COMMAND InitTermTest EXPECT_FAIL)
add_xerces_test(InitTermTest1    COMMAND InitTermTest personal.xml)
add_xerces_test(InitTermTest2    COMMAND InitTermTest -n -s personal-schema.xml)
add_xerces_test(InitTermTest3    COMMAND InitTermTest -n -s -f personal-schema.xml)

if(NOT XERCES_USE_MUTEXMGR_NOTHREAD)
  add_xerces_test(ThreadTest       COMMAND ThreadTest EXPECT_FAIL)
  add_xerces_test(ThreadTest1      COMMAND ThreadTest -parser=sax               -v=never  -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest2      COMMAND ThreadTest -parser=dom               -v=never  -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest3      COMMAND ThreadTest -parser=sax2              -v=never  -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest4      COMMAND ThreadTest -parser=sax               -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest5      COMMAND ThreadTest -parser=dom               -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest6      COMMAND ThreadTest -parser=sax2              -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest7      COMMAND ThreadTest -parser=sax  -gc          -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest8      COMMAND ThreadTest -parser=dom  -gc          -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest9      COMMAND ThreadTest -parser=sax2 -gc          -v=always -quiet -threads 10 -time 20 personal.xml)
  add_xerces_test(ThreadTest10     COMMAND ThreadTest -parser=sax  -n -s -f     -v=always -quiet -threads 10 -time 20 personal-schema.xml)
  add_xerces_test(ThreadTest11     COMMAND ThreadTest -parser=dom  -n -s -f     -v=always -quiet -threads 10 -time 20 personal-schema.xml)
  add_xerces_test(ThreadTest12     COMMAND ThreadTest -parser=sax2 -n -s -f     -v=always -quiet -threads 10 -time 20 personal-schema.xml)
  add_xerces_test(ThreadTest13     COMMAND ThreadTest -parser=sax  -gc -n -s -f -v=always -quiet -threads 10 -time 20 personal-schema.xml)
  add_xerces_test(ThreadTest14     COMMAND ThreadTest -parser=dom  -gc -n -s -f -v=always -quiet -threads 10 -time 20 personal-schema.xml)
  add_xerces_test(ThreadTest15     COMMAND ThreadTest -parser=sax2 -gc -n -s -f -v=always -quiet -threads 10 -time 20 personal-schema.xml)
endif()

add_xerces_test(MemHandlerTest   COMMAND MemHandlerTest EXPECT_FAIL)
add_xerces_test(MemHandlerTest1  COMMAND MemHandlerTest -v=always -n -r=2 personal.xml)
add_xerces_test(MemHandlerTest2  COMMAND MemHandlerTest -v=always -n -r=2 -s -f personal-schema.xml)

add_xerces_test(DOMTypeInfoTest WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src/DOM/TypeInfo" COMMAND DOMTypeInfoTest)

if(XERCES_XMLCH_T STREQUAL "char16_t")
  add_xerces_test(Char16Test       COMMAND Char16Test)
endif()
