//============================================================================ // 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. // // Copyright 2014 National Technology & Engineering Solutions of Sandia, LLC (NTESS). // Copyright 2014 UT-Battelle, LLC. // Copyright 2014 Los Alamos National Security. // // Under the terms of Contract DE-NA0003525 with NTESS, // the U.S. Government retains certain rights in this software. // // Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National // Laboratory (LANL), the U.S. Government retains certain rights in // this software. //============================================================================ #include #include #include #include #include namespace { class TypeSet { using NameSetType = std::set; NameSetType NameSet; public: template void AddExpected(T) { this->NameSet.insert(vtkm::testing::TypeName::Name()); } template void Found(T) { std::string name = vtkm::testing::TypeName::Name(); //std::cout << " found " << name << std::endl; NameSetType::iterator typeLocation = this->NameSet.find(name); if (typeLocation != this->NameSet.end()) { // This type is expected. Remove it to mark it found. this->NameSet.erase(typeLocation); } else { std::cout << "**** Did not expect to get type " << name << std::endl; VTKM_TEST_FAIL("Got unexpected type."); } } void CheckFound() { for (NameSetType::iterator typeP = this->NameSet.begin(); typeP != this->NameSet.end(); typeP++) { std::cout << "**** Failed to find " << *typeP << std::endl; } VTKM_TEST_ASSERT(this->NameSet.empty(), "List did not call functor on all expected types."); } }; struct TestFunctor { TypeSet ExpectedTypes; TestFunctor(const TypeSet& expectedTypes) : ExpectedTypes(expectedTypes) { } template VTKM_CONT void operator()(T) { this->ExpectedTypes.Found(T()); } }; template void TryList(const TypeSet& expected, ListTag) { TestFunctor functor(expected); vtkm::ListForEach(functor, ListTag()); functor.ExpectedTypes.CheckFound(); } void TestLists() { std::cout << "TypeListTagId" << std::endl; TypeSet id; id.AddExpected(vtkm::Id()); TryList(id, vtkm::TypeListTagId()); std::cout << "TypeListTagId2" << std::endl; TypeSet id2; id2.AddExpected(vtkm::Id2()); TryList(id2, vtkm::TypeListTagId2()); std::cout << "TypeListTagId3" << std::endl; TypeSet id3; id3.AddExpected(vtkm::Id3()); TryList(id3, vtkm::TypeListTagId3()); std::cout << "TypeListTagIndex" << std::endl; TypeSet index; index.AddExpected(vtkm::Id()); index.AddExpected(vtkm::Id2()); index.AddExpected(vtkm::Id3()); TryList(index, vtkm::TypeListTagIndex()); std::cout << "TypeListTagFieldScalar" << std::endl; TypeSet scalar; scalar.AddExpected(vtkm::Float32()); scalar.AddExpected(vtkm::Float64()); TryList(scalar, vtkm::TypeListTagFieldScalar()); std::cout << "TypeListTagFieldVec2" << std::endl; TypeSet vec2; vec2.AddExpected(vtkm::Vec()); vec2.AddExpected(vtkm::Vec()); TryList(vec2, vtkm::TypeListTagFieldVec2()); std::cout << "TypeListTagFieldVec3" << std::endl; TypeSet vec3; vec3.AddExpected(vtkm::Vec()); vec3.AddExpected(vtkm::Vec()); TryList(vec3, vtkm::TypeListTagFieldVec3()); std::cout << "TypeListTagFieldVec4" << std::endl; TypeSet vec4; vec4.AddExpected(vtkm::Vec()); vec4.AddExpected(vtkm::Vec()); TryList(vec4, vtkm::TypeListTagFieldVec4()); std::cout << "TypeListTagField" << std::endl; TypeSet field; field.AddExpected(vtkm::Float32()); field.AddExpected(vtkm::Float64()); field.AddExpected(vtkm::Vec()); field.AddExpected(vtkm::Vec()); field.AddExpected(vtkm::Vec()); field.AddExpected(vtkm::Vec()); field.AddExpected(vtkm::Vec()); field.AddExpected(vtkm::Vec()); TryList(field, vtkm::TypeListTagField()); std::cout << "TypeListTagCommon" << std::endl; TypeSet common; common.AddExpected(vtkm::Float32()); common.AddExpected(vtkm::Float64()); common.AddExpected(vtkm::UInt8()); common.AddExpected(vtkm::Int32()); common.AddExpected(vtkm::Int64()); common.AddExpected(vtkm::Vec()); common.AddExpected(vtkm::Vec()); TryList(common, vtkm::TypeListTagCommon()); std::cout << "TypeListTagScalarAll" << std::endl; TypeSet scalarsAll; scalarsAll.AddExpected(vtkm::Float32()); scalarsAll.AddExpected(vtkm::Float64()); scalarsAll.AddExpected(vtkm::Int8()); scalarsAll.AddExpected(vtkm::UInt8()); scalarsAll.AddExpected(vtkm::Int16()); scalarsAll.AddExpected(vtkm::UInt16()); scalarsAll.AddExpected(vtkm::Int32()); scalarsAll.AddExpected(vtkm::UInt32()); scalarsAll.AddExpected(vtkm::Int64()); scalarsAll.AddExpected(vtkm::UInt64()); TryList(scalarsAll, vtkm::TypeListTagScalarAll()); std::cout << "TypeListTagVecCommon" << std::endl; TypeSet vecCommon; vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); vecCommon.AddExpected(vtkm::Vec()); TryList(vecCommon, vtkm::TypeListTagVecCommon()); std::cout << "TypeListTagVecAll" << std::endl; TypeSet vecAll; vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); vecAll.AddExpected(vtkm::Vec()); TryList(vecAll, vtkm::TypeListTagVecAll()); std::cout << "TypeListTagAll" << std::endl; TypeSet all; all.AddExpected(vtkm::Float32()); all.AddExpected(vtkm::Float64()); all.AddExpected(vtkm::Int8()); all.AddExpected(vtkm::UInt8()); all.AddExpected(vtkm::Int16()); all.AddExpected(vtkm::UInt16()); all.AddExpected(vtkm::Int32()); all.AddExpected(vtkm::UInt32()); all.AddExpected(vtkm::Int64()); all.AddExpected(vtkm::UInt64()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); all.AddExpected(vtkm::Vec()); TryList(all, vtkm::TypeListTagAll()); } } // anonymous namespace int UnitTestTypeListTag(int argc, char* argv[]) { return vtkm::testing::Testing::Run(TestLists, argc, argv); }