// // Created by ollie on 12/19/17. // #include #include //#include //#include #include template class TestInnerJoin { public: template bool TestArrayHandle(const vtkm::cont::ArrayHandle& ah, const T* expected, vtkm::Id size) const { if (size != ah.GetNumberOfValues()) { return false; } for (vtkm::Id i = 0; i < size; ++i) { if (ah.GetPortalConstControl().Get(i) != expected[i]) { return false; } } return true; } void TestTwoArrays() const { using Algorithm = vtkm::cont::DeviceAdapterAlgorithm; std::vector A = { 8, 3, 6, 8, 9, 5, 12, 10, 14 }; std::vector B = { 7, 11, 9, 8, 5, 1, 0, 5 }; vtkm::cont::ArrayHandle A_arr = vtkm::cont::make_ArrayHandle(A); vtkm::cont::ArrayHandle B_arr = vtkm::cont::make_ArrayHandle(B); vtkm::cont::ArrayHandle idxA; vtkm::cont::ArrayHandle idxB; Algorithm::Copy(vtkm::cont::ArrayHandleCounting(0, 1, A_arr.GetNumberOfValues()), idxA); Algorithm::Copy(vtkm::cont::ArrayHandleCounting(0, 1, B_arr.GetNumberOfValues()), idxB); vtkm::cont::ArrayHandle joinedIndex; vtkm::cont::ArrayHandle outA; vtkm::cont::ArrayHandle outB; InnerJoin().Run(A_arr, idxA, B_arr, idxB, joinedIndex, outA, outB); vtkm::Id expectedIndex[] = { 5, 5, 8, 8, 9 }; VTKM_TEST_ASSERT(TestArrayHandle(joinedIndex, expectedIndex, 5), "Wrong joined keys"); vtkm::Id expectedOutA[] = { 5, 5, 0, 3, 4 }; VTKM_TEST_ASSERT(TestArrayHandle(outA, expectedOutA, 5), "Wrong joined values"); vtkm::Id expectedOutB[] = { 4, 7, 3, 3, 2 }; VTKM_TEST_ASSERT(TestArrayHandle(outB, expectedOutB, 5), "Wrong joined values"); } void operator()() const { this->TestTwoArrays(); } }; int UnitTestInnerJoin(int, char* []) { return vtkm::cont::testing::Testing::Run(TestInnerJoin()); }