//============================================================================ // Copyright (c) Kitware, Inc. // All rights reserved. // See LICENSE.txt for details. // // This software is distributed WITHOUT ANY WARRANTY; without even // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR // PURPOSE. See the above copyright notice for more information. //============================================================================ #include #include #include namespace { template struct TestClass { }; } // anonymous namespace namespace vtkm { namespace testing { template struct TypeName> { static std::string Name() { std::stringstream stream; stream << "TestClass<" << N << ">"; return stream.str(); } }; } } // namespace vtkm::testing namespace { template struct DoubleTransformLazy; template struct DoubleTransformLazy> { using type = TestClass<2 * N>; }; template using DoubleTransform = typename DoubleTransformLazy::type; template struct EvenPredicate; template struct EvenPredicate> : std::integral_constant { }; template void CheckSame(T1, T2) { VTKM_STATIC_ASSERT((std::is_same::value)); std::cout << " Got expected type: " << vtkm::testing::TypeName::Name() << std::endl; } template void CheckList(ExpectedList, List) { VTKM_IS_LIST(List); CheckSame(ExpectedList{}, List{}); } template int test_number(TestClass) { return N; } template struct MutableFunctor { std::vector FoundTypes; template VTKM_CONT void operator()(U u) { this->FoundTypes.push_back(test_number(u)); } }; template struct ConstantFunctor { template VTKM_CONT void operator()(U u, VectorType& vector) const { vector.push_back(test_number(u)); } }; void TryForEach() { using TestList = vtkm::List, TestClass<1>, TestClass<2>, TestClass<3>, TestClass<5>, TestClass<8>>; const std::vector expectedList = { 1, 1, 2, 3, 5, 8 }; std::cout << "Check mutable for each" << std::endl; MutableFunctor functor; vtkm::ListForEach(functor, TestList{}); VTKM_TEST_ASSERT(expectedList == functor.FoundTypes); std::cout << "Check constant for each" << std::endl; std::vector foundTypes; vtkm::ListForEach(ConstantFunctor{}, TestList{}, foundTypes); VTKM_TEST_ASSERT(expectedList == foundTypes); } void TestLists() { using SimpleCount = vtkm::List, TestClass<2>, TestClass<3>, TestClass<4>>; using EvenList = vtkm::List, TestClass<4>, TestClass<6>, TestClass<8>>; using LongList = vtkm::List, TestClass<2>, TestClass<3>, TestClass<4>, TestClass<5>, TestClass<6>, TestClass<7>, TestClass<8>, TestClass<9>, TestClass<10>, TestClass<11>, TestClass<12>, TestClass<13>, TestClass<14>>; using RepeatList = vtkm::List, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<1>, TestClass<14>>; TryForEach(); std::cout << "Valid List Tag Checks" << std::endl; VTKM_TEST_ASSERT(vtkm::internal::IsList>>::value); VTKM_TEST_ASSERT(vtkm::internal::IsList, TestClass<22>>>::value); VTKM_TEST_ASSERT(vtkm::internal::IsList::value); VTKM_TEST_ASSERT(vtkm::internal::IsList::value); std::cout << "ListEmpty" << std::endl; CheckList(vtkm::List<>{}, vtkm::ListEmpty{}); std::cout << "ListAppend" << std::endl; CheckList(vtkm::List, TestClass<32>, TestClass<33>, TestClass<11>, TestClass<21>, TestClass<22>>{}, vtkm::ListAppend, TestClass<32>, TestClass<33>>, vtkm::List>, vtkm::List, TestClass<22>>>{}); std::cout << "ListIntersect" << std::endl; CheckList(vtkm::List, TestClass<5>>{}, vtkm::ListIntersect< vtkm::List, TestClass<2>, TestClass<3>, TestClass<4>, TestClass<5>>, vtkm::List, TestClass<5>, TestClass<6>>>{}); CheckList(vtkm::List, TestClass<2>>{}, vtkm::ListIntersect, TestClass<2>>, vtkm::ListUniversal>{}); CheckList(vtkm::List, TestClass<2>>{}, vtkm::ListIntersect, TestClass<2>>>{}); std::cout << "ListTransform" << std::endl; CheckList(EvenList{}, vtkm::ListTransform{}); std::cout << "ListRemoveIf" << std::endl; CheckList(vtkm::List, TestClass<3>>{}, vtkm::ListRemoveIf{}); std::cout << "ListSize" << std::endl; VTKM_TEST_ASSERT(vtkm::ListSize::value == 0); VTKM_TEST_ASSERT(vtkm::ListSize>>::value == 1); VTKM_TEST_ASSERT(vtkm::ListSize, TestClass<4>>>::value == 2); std::cout << "ListCross" << std::endl; CheckList(vtkm::List, TestClass<11>>, vtkm::List, TestClass<11>>, vtkm::List, TestClass<11>>>{}, vtkm::ListCross, TestClass<32>, TestClass<33>>, vtkm::List>>{}); std::cout << "ListAt" << std::endl; CheckSame(TestClass<2>{}, vtkm::ListAt{}); CheckSame(TestClass<4>{}, vtkm::ListAt{}); CheckSame(TestClass<6>{}, vtkm::ListAt{}); CheckSame(TestClass<8>{}, vtkm::ListAt{}); std::cout << "ListIndexOf" << std::endl; VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 0); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 2); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 3); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == -1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 0); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 2); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 3); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 4); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 5); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 6); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 7); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 8); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 9); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 10); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 11); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 12); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 13); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == -1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == -1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == -1); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 0); VTKM_TEST_ASSERT(vtkm::ListIndexOf>::value == 13); std::cout << "ListHas" << std::endl; VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(!vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(!vtkm::ListHas>::value); VTKM_TEST_ASSERT(!vtkm::ListHas>::value); VTKM_TEST_ASSERT(!vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); VTKM_TEST_ASSERT(vtkm::ListHas>::value); } } // anonymous namespace int UnitTestList(int argc, char* argv[]) { return vtkm::testing::Testing::Run(TestLists, argc, argv); }