// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause #include "vtkCellArray.h" #include "MockDataArray.h" #include "vtkArrayDispatch.h" #include "vtkArrayDispatchDataSetArrayList.h" #include "vtkCellArrayIterator.h" #include "vtkDataArrayRange.h" #include "vtkIdList.h" #include "vtkIdTypeArray.h" #include "vtkIntArray.h" #include "vtkLogger.h" #include "vtkLongArray.h" #include "vtkLongLongArray.h" #include "vtkNew.h" #include "vtkPolyData.h" #include "vtkSmartPointer.h" #include "vtkTriangle.h" #include #include #include #include #include namespace { [[noreturn]] void ThrowAssertError(const std::string& msg) { // You can set breakpoints here: throw std::runtime_error(msg); } #define TEST_ASSERT(cond) \ do \ { \ std::cout << "=> Check " << #cond << " ... "; \ if (!(cond)) \ { \ std::cout << "false" << std::endl; \ ThrowAssertError(vtkQuoteMacro(__FILE__) ":" vtkQuoteMacro( \ __LINE__) ": test assertion failed: (" #cond ")"); \ } \ std::cout << "true" << std::endl; \ } while (false) template struct CellArrayFactory { static vtkSmartPointer New() { return nullptr; } }; template <> struct CellArrayFactory { static vtkSmartPointer New() { auto cellArray = vtkSmartPointer::New(); cellArray->Use32BitStorage(); TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int32); return cellArray; } }; template <> struct CellArrayFactory { static vtkSmartPointer New() { auto cellArray = vtkSmartPointer::New(); cellArray->Use64BitStorage(); TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Int64); return cellArray; } }; template <> struct CellArrayFactory { static vtkSmartPointer New() { auto cellArray = vtkSmartPointer::New(); cellArray->UseFixedSize32BitStorage(3); TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::FixedSizeInt32); return cellArray; } }; template <> struct CellArrayFactory { static vtkSmartPointer New() { auto cellArray = vtkSmartPointer::New(); cellArray->UseFixedSize64BitStorage(3); TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::FixedSizeInt64); return cellArray; } }; struct DummyWorker { template [[maybe_unused]] void operator()(OffsetsT*, ConnectivityT*) { void(); } }; template struct CellArrayFactory { static vtkSmartPointer New() { using OffsetsValueT = typename OffsetsArrayT::ValueType; auto cellArray = vtkSmartPointer::New(); // By passing array types which are NOT in vtkCellArray::InputArrayList, // vtkCellArray can be put into the "Generic" storage mode. vtkNew placeholderConn; vtkNew placeholderOffsets; if (auto countingOffsets = vtkAffineArray::FastDownCast(placeholderOffsets)) { countingOffsets->ConstructBackend(3, 0); } // initialize the offsets array with one element i.e, number of elements in the connectivity. placeholderOffsets->InsertNextValue(0); cellArray->SetData(placeholderOffsets, placeholderConn); DummyWorker worker; using Dispatcher = vtkArrayDispatch::Dispatch2ByArrayWithSameValueType; // Ensure that the arrays are indeed not in the InputArrayList if (!Dispatcher::Execute( cellArray->GetOffsetsArray(), cellArray->GetConnectivityArray(), worker)) { TEST_ASSERT(cellArray->GetStorageType() == vtkCellArray::StorageTypes::Generic); } else { TEST_ASSERT(cellArray->GetStorageType() != vtkCellArray::StorageTypes::Generic); } return cellArray; } }; template vtkSmartPointer GetCellIds(vtkIdType cellId, bool reverse = false, vtkIdType offset = 0) { auto ids = vtkSmartPointer::New(); if (FixedSize) { if (cellId == 0) { ids->InsertNextId(0); ids->InsertNextId(1); ids->InsertNextId(2); } else if (cellId == 1) { ids->InsertNextId(3); ids->InsertNextId(4); ids->InsertNextId(5); } else if (cellId == 2) { ids->InsertNextId(7); ids->InsertNextId(8); ids->InsertNextId(9); } else { throw std::runtime_error("Invalid cellId"); } } else { if (cellId == 0) { ids->InsertNextId(0); ids->InsertNextId(1); ids->InsertNextId(2); ids->InsertNextId(3); ids->InsertNextId(4); } else if (cellId == 1) { ids->InsertNextId(3); ids->InsertNextId(4); ids->InsertNextId(5); } else if (cellId == 2) { ids->InsertNextId(7); ids->InsertNextId(8); ids->InsertNextId(9); ids->InsertNextId(4); ids->InsertNextId(2); ids->InsertNextId(1); } else { throw std::runtime_error("Invalid cellId"); } } if (reverse) { std::reverse(ids->begin(), ids->end()); } if (offset > 0) { for (vtkIdType i = 0; i < ids->GetNumberOfIds(); ++i) { ids->SetId(i, ids->GetId(i) + offset); } } return ids; } template void FillCellArray(vtkCellArray* cellArray, bool reverse = false) { cellArray->InsertNextCell(GetCellIds(0, reverse)); cellArray->InsertNextCell(GetCellIds(1, reverse)); cellArray->InsertNextCell(GetCellIds(2, reverse)); } template bool ValidateCell(vtkIdType cellId, vtkIdType npts, const vtkIdType* pts, bool reverse = false, vtkIdType offset = 0) { auto ids = GetCellIds(cellId, reverse, offset); TEST_ASSERT(npts == ids->GetNumberOfIds()); bool equal = true; for (vtkIdType i = 0; i < npts; ++i) { equal &= pts[i] == ids->GetId(i); } return equal; } template void ValidateCellArray(vtkCellArray* cellArray, bool reverse = false, vtkIdType offset = 0) { vtkIdType npts; const vtkIdType* pts; auto it = vtk::TakeSmartPointer(cellArray->NewIterator()); it->GoToFirstCell(); for (int i = 0; i < 3; ++i) { TEST_ASSERT(!it->IsDoneWithTraversal()); it->GetCurrentCell(npts, pts); TEST_ASSERT(ValidateCell(i, npts, pts, reverse, offset)); it->GoToNextCell(); } TEST_ASSERT(it->IsDoneWithTraversal()); } void TestAllocate(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Initialize(); cellArray->AllocateEstimate(100, 4); TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 101); TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 400); cellArray->Initialize(); cellArray->AllocateExact(100, 256); TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 101); TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 256); } void TestResize(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Initialize(); cellArray->ResizeExact(128, 256); TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 129); TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 256); } void TestInitialize(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Initialize(); cellArray->ResizeExact(128, 256); cellArray->Initialize(); TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 1); TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 0); TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 1); TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == 0); } template void TestSqueeze(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Initialize(); cellArray->AllocateExact(128, 256); FillCellArray(cellArray); cellArray->Squeeze(); TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 4); TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == (FixedSize ? 9 : 14)); TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() == 4); TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() == (FixedSize ? 9 : 14)); TEST_ASSERT(cellArray->GetNumberOfCells() == 3); ValidateCellArray(cellArray); } void TestReset(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Initialize(); cellArray->ResizeExact(128, 256); cellArray->Reset(); TEST_ASSERT(cellArray->GetOffsetsArray()->GetNumberOfValues() == 1); TEST_ASSERT(cellArray->GetConnectivityArray()->GetNumberOfValues() == 0); TEST_ASSERT(cellArray->GetOffsetsArray()->GetSize() >= 129); TEST_ASSERT(cellArray->GetConnectivityArray()->GetSize() >= 256); } template void TestIsValidOffsets(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->IsValid()); FillCellArray(cellArray); TEST_ASSERT(cellArray->IsValid()); cellArray->GetOffsetsArray()->Reset(); TEST_ASSERT(!cellArray->IsValid()); // This should reuse the old buffer: cellArray->GetOffsetsArray()->SetNumberOfValues(4); TEST_ASSERT(cellArray->IsValid()); cellArray->GetOffsetsArray()->SetComponent(1, 0, 5); cellArray->GetOffsetsArray()->SetComponent(2, 0, 3); TEST_ASSERT(!cellArray->IsValid()); cellArray->GetOffsetsArray()->SetComponent(1, 0, 3); cellArray->GetOffsetsArray()->SetComponent(2, 0, 5); TEST_ASSERT(cellArray->IsValid()); } template void TestIsValidConnectivity(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->IsValid()); FillCellArray(cellArray); TEST_ASSERT(cellArray->IsValid()); cellArray->GetConnectivityArray()->SetNumberOfValues(5); TEST_ASSERT(!cellArray->IsValid()); cellArray->GetConnectivityArray()->SetNumberOfValues(4); TEST_ASSERT(!cellArray->IsValid()); cellArray->GetConnectivityArray()->SetNumberOfValues(FixedSize ? 9 : 14); TEST_ASSERT(cellArray->IsValid()); } template void TestGetNumberOfCells(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->GetNumberOfCells() == 0); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfCells() == 0); FillCellArray(cellArray); TEST_ASSERT(cellArray->GetNumberOfCells() == 3); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfCells() == 0); } template void TestGetNumberOfOffsets(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); FillCellArray(cellArray); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 4); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); } template void TestGetNumberOfConnectivityIds(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); FillCellArray(cellArray); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == (FixedSize ? 9 : 14)); cellArray->Initialize(); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } template void TestNewIterator(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); { auto iter = vtk::TakeSmartPointer(cellArray->NewIterator()); TEST_ASSERT(iter->IsDoneWithTraversal()); iter->GoToFirstCell(); TEST_ASSERT(iter->IsDoneWithTraversal()); } cellArray->Initialize(); { auto iter = vtk::TakeSmartPointer(cellArray->NewIterator()); TEST_ASSERT(iter->IsDoneWithTraversal()); iter->GoToFirstCell(); TEST_ASSERT(iter->IsDoneWithTraversal()); } FillCellArray(cellArray); ValidateCellArray(cellArray); cellArray->Initialize(); { auto iter = vtk::TakeSmartPointer(cellArray->NewIterator()); TEST_ASSERT(iter->IsDoneWithTraversal()); iter->GoToFirstCell(); TEST_ASSERT(iter->IsDoneWithTraversal()); } } template void TestSetDataImpl(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); using OffsetsValueType = typename OffsetsArrayType::ValueType; using ConnectivityValueType = typename ConnectivityArrayType::ValueType; constexpr bool FixedSize = std::is_base_of_v, OffsetsArrayType>; vtkNew test; test->DeepCopy(cellArray); // copy config settings vtkNew offsets; if (auto countingOffsets = vtkAffineArray::SafeDownCast(offsets)) { countingOffsets->ConstructBackend(GetCellIds(0)->GetNumberOfIds(), 0); } vtkNew conn; offsets->InsertNextValue(0); for (vtkIdType i = 0; i < 3; ++i) { auto ids = GetCellIds(i); offsets->InsertNextValue(offsets->GetValue(i) + ids->GetNumberOfIds()); for (vtkIdType j = 0; j < ids->GetNumberOfIds(); ++j) { conn->InsertNextValue(ids->GetId(j)); } } auto offsetsMTtime = offsets->GetMTime(); auto connMTtime = conn->GetMTime(); test->SetData(offsets, conn); // checkNoCopy and MTime TEST_ASSERT(test->GetOffsetsArray() == offsets && offsets->GetMTime() == offsetsMTtime); TEST_ASSERT(test->GetConnectivityArray() == conn && conn->GetMTime() == connMTtime); if (std::is_base_of_v, OffsetsArrayType> && std::is_base_of_v, ConnectivityArrayType> && std::is_same_v) { if (std::is_same_v) { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(test->IsStorage32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(!test->IsStorageGeneric()); } else if (std::is_same_v) { TEST_ASSERT(test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(!test->IsStorageGeneric()); } else { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(test->IsStorageGeneric()); } } else if (std::is_base_of_v, OffsetsArrayType> && std::is_base_of_v, ConnectivityArrayType> && std::is_same_v) { if (std::is_same_v) { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(test->IsStorageFixedSize32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageGeneric()); } else if (std::is_same_v) { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(!test->IsStorageGeneric()); } else { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(test->IsStorageGeneric()); } } else { TEST_ASSERT(!test->IsStorage64Bit()); TEST_ASSERT(!test->IsStorage32Bit()); TEST_ASSERT(!test->IsStorageFixedSize64Bit()); TEST_ASSERT(!test->IsStorageFixedSize32Bit()); TEST_ASSERT(test->IsStorageGeneric()); } TEST_ASSERT(test->GetNumberOfCells() == 3); TEST_ASSERT(test->GetNumberOfConnectivityIds() == (FixedSize ? 9 : 14)); TEST_ASSERT(test->GetNumberOfOffsets() == 4); { ValidateCellArray(test); } } void TestSetData(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl, vtkIdTypeArray>(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl(cellArray); TestSetDataImpl, vtkTypeInt32Array>(cellArray); TestSetDataImpl, vtkTypeInt64Array>(cellArray); TestSetDataImpl, vtkIntArray>(cellArray); TestSetDataImpl, vtkLongArray>(cellArray); TestSetDataImpl, vtkLongLongArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); TestSetDataImpl, MockDataArray>(cellArray); } struct TestIsStorage64BitImpl : public vtkCellArray::DispatchUtilities { template void operator()(OffsetsT*, ConnectivityT*, bool expect64Bit) const { using ValueType = GetAPIType; constexpr bool is64Bit = sizeof(ValueType) == 8 && std::is_base_of_v, OffsetsT> && std::is_base_of_v, ConnectivityT>; TEST_ASSERT(is64Bit == expect64Bit); } }; void TestIsStorage64Bit(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Dispatch(TestIsStorage64BitImpl{}, cellArray->IsStorage64Bit()); } struct TestIsStorage32BitImpl : public vtkCellArray::DispatchUtilities { template void operator()(OffsetsT*, ConnectivityT*, bool expect32Bit) const { using ValueType = GetAPIType; constexpr bool is32Bit = sizeof(ValueType) == 4 && std::is_base_of_v, OffsetsT> && std::is_base_of_v, ConnectivityT>; TEST_ASSERT(is32Bit == expect32Bit); } }; void TestIsStorage32Bit(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Dispatch(TestIsStorage32BitImpl{}, cellArray->IsStorage32Bit()); } struct TestIsStorageFixedSize64BitImpl : public vtkCellArray::DispatchUtilities { template void operator()(OffsetsT*, ConnectivityT*, bool expectFixedSize64Bit) const { using ValueType = GetAPIType; constexpr bool isFixedSize64Bit = sizeof(ValueType) == 8 && std::is_base_of_v, OffsetsT> && std::is_base_of_v, ConnectivityT>; TEST_ASSERT(isFixedSize64Bit == expectFixedSize64Bit); } }; void TestIsStorageFixedSize32Bit(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Dispatch(TestIsStorageFixedSize64BitImpl{}, cellArray->IsStorageFixedSize64Bit()); } struct TestIsStorageFixedSize32BitImpl : public vtkCellArray::DispatchUtilities { template void operator()(OffsetsT*, ConnectivityT*, bool expectFixedSize32Bit) const { using ValueType = GetAPIType; constexpr bool isFixedSize32Bit = sizeof(ValueType) == 4 && std::is_base_of_v, OffsetsT> && std::is_base_of_v, ConnectivityT>; TEST_ASSERT(isFixedSize32Bit == expectFixedSize32Bit); } }; void TestIsStorageFixedSize64Bit(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Dispatch(TestIsStorageFixedSize32BitImpl{}, cellArray->IsStorageFixedSize32Bit()); } struct TestIsStorageGenericImpl : public vtkCellArray::DispatchUtilities { template void operator()(OffsetsT*, ConnectivityT*, bool expectGeneric) const { using ValueType = GetAPIType; constexpr bool isGeneric = !std::is_base_of_v, OffsetsT> && !std::is_base_of_v, OffsetsT> && !std::is_base_of_v, ConnectivityT> && std::is_base_of_v && std::is_base_of_v; TEST_ASSERT(isGeneric == expectGeneric); } }; void TestIsStorageGeneric(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); cellArray->Dispatch(TestIsStorageGenericImpl{}, cellArray->IsStorageGeneric()); } void TestUse32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->Use32BitStorage(); TEST_ASSERT(cellArray->IsStorage32Bit()); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestUse64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->Use64BitStorage(); TEST_ASSERT(cellArray->IsStorage64Bit()); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestUseDefaultStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->UseDefaultStorage(); TEST_ASSERT(cellArray->IsStorage64Bit() == (sizeof(vtkIdType) == 8)); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestUseFixedSize32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->UseFixedSize32BitStorage(3); TEST_ASSERT(cellArray->IsStorageFixedSize32Bit()); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestUseFixedSize64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->UseFixedSize64BitStorage(3); TEST_ASSERT(cellArray->IsStorageFixedSize64Bit()); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestUseFixedSizeDefaultStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); // Add some data to make sure that switching storage re-initializes data: FillCellArray(cellArray); cellArray->UseFixedSizeDefaultStorage(3); TEST_ASSERT(cellArray->IsStorageFixedSize64Bit() == (sizeof(vtkIdType) == 8)); TEST_ASSERT(cellArray->GetNumberOfOffsets() == 1); TEST_ASSERT(cellArray->GetNumberOfConnectivityIds() == 0); } void TestCanConvertTo32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); if (cellArray->IsStorage64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(!cellArray->CanConvertTo32BitStorage()); #endif // VTK_USE_64BIT_IDS } else if (cellArray->IsStorage32Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); } else if (cellArray->IsStorageFixedSize64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(!cellArray->CanConvertTo32BitStorage()); #endif // VTK_USE_64BIT_IDS } else { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); } } void TestCanConvertTo64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); if (cellArray->IsStorage64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); #endif // VTK_USE_64BIT_IDS } else if (cellArray->IsStorage32Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); } else if (cellArray->IsStorageFixedSize64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); #endif // VTK_USE_64BIT_IDS } else { cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); } } void TestCanConvertToFixedSize32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage()); if (cellArray->IsStorage64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(!cellArray->CanConvertToFixedSize32BitStorage()); #endif // VTK_USE_64BIT_IDS } else if (cellArray->IsStorage32Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage()); } else if (cellArray->IsStorageFixedSize64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize32BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(!cellArray->CanConvertToFixedSize32BitStorage()); #endif // VTK_USE_64BIT_IDS } else { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertTo32BitStorage()); } } void TestCanConvertToFixedSize64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->CanConvertTo64BitStorage()); if (cellArray->IsStorage64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); #endif // VTK_USE_64BIT_IDS } else if (cellArray->IsStorage32Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); } else if (cellArray->IsStorageFixedSize64Bit()) { cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); #ifdef VTK_USE_64BIT_IDS cellArray->InsertNextCell({ 0, 1, static_cast(VTK_TYPE_INT32_MAX) + 1 }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); cellArray->InsertNextCell({ 0, 1, VTK_TYPE_INT64_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); #endif // VTK_USE_64BIT_IDS } else { cellArray->InsertNextCell({ 0, VTK_TYPE_INT32_MAX }); TEST_ASSERT(cellArray->CanConvertToFixedSize64BitStorage()); } } template void TestConvertTo32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); TEST_ASSERT(cellArray->ConvertTo32BitStorage()); TEST_ASSERT(cellArray->IsStorage32Bit()); // Ensure that data is still good: ValidateCellArray(cellArray); } template void TestConvertTo64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); TEST_ASSERT(cellArray->ConvertTo64BitStorage()); TEST_ASSERT(cellArray->IsStorage64Bit()); // Ensure that data is still good: ValidateCellArray(cellArray); } void TestConvertToFixedSize32BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); TEST_ASSERT(cellArray->ConvertToFixedSize32BitStorage()); TEST_ASSERT(cellArray->IsStorageFixedSize32Bit()); // Ensure that data is still good: ValidateCellArray(cellArray); } void TestConvertToFixedSize64BitStorage(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); TEST_ASSERT(cellArray->ConvertToFixedSize64BitStorage()); TEST_ASSERT(cellArray->IsStorageFixedSize64Bit()); // Ensure that data is still good: ValidateCellArray(cellArray); } void TestGetOffsetsArray(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); switch (cellArray->GetStorageType()) { case vtkCellArray::Int64: TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAOSArray64()); break; case vtkCellArray::Int32: TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAOSArray32()); break; case vtkCellArray::FixedSizeInt64: TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAffineArray64()); break; case vtkCellArray::FixedSizeInt32: TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsAffineArray32()); break; case vtkCellArray::Generic: default: TEST_ASSERT(cellArray->GetOffsetsArray() == cellArray->GetOffsetsArray()); break; } } void TestGetConnectivityArray(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); switch (cellArray->GetStorageType()) { case vtkCellArray::Int64: TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray64()); break; case vtkCellArray::Int32: TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray32()); break; case vtkCellArray::FixedSizeInt64: TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray64()); break; case vtkCellArray::FixedSizeInt32: TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityAOSArray32()); break; case vtkCellArray::Generic: default: TEST_ASSERT(cellArray->GetConnectivityArray() == cellArray->GetConnectivityArray()); break; } } template void TestIsHomogeneous(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->IsHomogeneous() == 0); cellArray->Initialize(); TEST_ASSERT(cellArray->IsHomogeneous() == 0); FillCellArray(cellArray); TEST_ASSERT(cellArray->IsHomogeneous() == 3); FillCellArray(cellArray); TEST_ASSERT(cellArray->IsHomogeneous() == 3); if (!FixedSize) { cellArray->InsertNextCell({ 5, 6 }); TEST_ASSERT(cellArray->IsHomogeneous() == -1); } cellArray->Initialize(); TEST_ASSERT(cellArray->IsHomogeneous() == 0); } template void TestTraversalSizePointer(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); vtkIdType npts; const vtkIdType* pts; cellArray->InitTraversal(); TEST_ASSERT(cellArray->GetTraversalCellId() == 0); TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0); TEST_ASSERT(ValidateCell(0, npts, pts)); TEST_ASSERT(cellArray->GetTraversalCellId() == 1); TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0); TEST_ASSERT(ValidateCell(1, npts, pts)); TEST_ASSERT(cellArray->GetTraversalCellId() == 2); TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0); TEST_ASSERT(ValidateCell(2, npts, pts)); cellArray->SetTraversalCellId(1); TEST_ASSERT(cellArray->GetTraversalCellId() == 1); TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0); TEST_ASSERT(ValidateCell(1, npts, pts)); TEST_ASSERT(cellArray->GetTraversalCellId() == 2); TEST_ASSERT(cellArray->GetNextCell(npts, pts) != 0); TEST_ASSERT(ValidateCell(2, npts, pts)); TEST_ASSERT(cellArray->GetNextCell(npts, pts) == 0); } template void TestTraversalIdList(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); vtkNew ids; cellArray->InitTraversal(); TEST_ASSERT(cellArray->GetNextCell(ids) != 0); TEST_ASSERT(ValidateCell(0, ids->GetNumberOfIds(), ids->GetPointer(0))); TEST_ASSERT(cellArray->GetNextCell(ids) != 0); TEST_ASSERT(ValidateCell(1, ids->GetNumberOfIds(), ids->GetPointer(0))); TEST_ASSERT(cellArray->GetNextCell(ids) != 0); TEST_ASSERT(ValidateCell(2, ids->GetNumberOfIds(), ids->GetPointer(0))); TEST_ASSERT(cellArray->GetNextCell(ids) == 0); } template void TestGetCellAtId(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); auto validate = [&](const vtkIdType cellId) { vtkIdType npts; const vtkIdType* pts; cellArray->GetCellAtId(cellId, npts, pts); TEST_ASSERT(ValidateCell(cellId, npts, pts)); vtkNew ids; cellArray->GetCellAtId(cellId, ids); TEST_ASSERT(ValidateCell(cellId, ids->GetNumberOfIds(), ids->GetPointer(0))); }; validate(2); validate(0); validate(1); } template void TestGetCellSize(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); TEST_ASSERT(cellArray->GetCellSize(1) == GetCellIds(1)->GetNumberOfIds()); TEST_ASSERT(cellArray->GetCellSize(0) == GetCellIds(0)->GetNumberOfIds()); TEST_ASSERT(cellArray->GetCellSize(2) == GetCellIds(2)->GetNumberOfIds()); } template void TestInsertNextCell(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TEST_ASSERT(cellArray->GetNumberOfCells() == 0); auto ids0 = GetCellIds(0); TEST_ASSERT(cellArray->InsertNextCell(ids0) == 0); TEST_ASSERT(cellArray->GetNumberOfCells() == 1); TEST_ASSERT(cellArray->InsertNextCell({ 3, 4, 5 }) == 1); // same as GetCellIds(1) TEST_ASSERT(cellArray->GetNumberOfCells() == 2); auto ids2 = GetCellIds(2); TEST_ASSERT(cellArray->InsertNextCell(ids2->GetNumberOfIds(), ids2->GetPointer(0)) == 2); TEST_ASSERT(cellArray->GetNumberOfCells() == 3); vtkNew triangle; auto ids3 = triangle->GetPointIds(); ids3->SetId(0, 4); ids3->SetId(1, 2); ids3->SetId(2, 1); TEST_ASSERT(cellArray->InsertNextCell(triangle) == 3); TEST_ASSERT(cellArray->GetNumberOfCells() == 4); vtkIdType npts; const vtkIdType* pts; cellArray->GetCellAtId(0, npts, pts); TEST_ASSERT(ValidateCell(0, npts, pts)); cellArray->GetCellAtId(1, npts, pts); TEST_ASSERT(ValidateCell(1, npts, pts)); cellArray->GetCellAtId(2, npts, pts); TEST_ASSERT(ValidateCell(2, npts, pts)); cellArray->GetCellAtId(3, npts, pts); TEST_ASSERT(npts == 3); TEST_ASSERT(pts[0] == 4); TEST_ASSERT(pts[1] == 2); TEST_ASSERT(pts[2] == 1); } template void TestIncrementalCellInsertion(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); auto ids0 = GetCellIds(0); TEST_ASSERT(cellArray->InsertNextCell(ids0->GetNumberOfIds()) == 0); for (vtkIdType i = 0; i < ids0->GetNumberOfIds(); ++i) { cellArray->InsertCellPoint(ids0->GetId(i)); } auto ids1 = GetCellIds(1); TEST_ASSERT(cellArray->InsertNextCell(ids1->GetNumberOfIds()) == 1); for (vtkIdType i = 0; i < ids1->GetNumberOfIds(); ++i) { cellArray->InsertCellPoint(ids1->GetId(i)); } auto ids2 = GetCellIds(2); TEST_ASSERT(cellArray->InsertNextCell(3) == 2); // 3 for Fixed Size, 6 for variable cellArray->InsertCellPoint(ids2->GetId(0)); cellArray->UpdateCellCount(ids2->GetNumberOfIds()); // changing count to 6 for variable size for (vtkIdType i = 1; i < ids2->GetNumberOfIds(); ++i) { cellArray->InsertCellPoint(ids2->GetId(i)); } ValidateCellArray(cellArray); } template void TestReverseCellAtId(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); auto validate = [&](const vtkIdType cellId, bool reverse) { vtkIdType npts; const vtkIdType* pts; cellArray->GetCellAtId(cellId, npts, pts); TEST_ASSERT(ValidateCell(cellId, npts, pts, reverse)); }; validate(0, false); validate(1, false); validate(2, false); cellArray->ReverseCellAtId(2); validate(0, false); validate(1, false); validate(2, true); cellArray->ReverseCellAtId(0); validate(0, true); validate(1, false); validate(2, true); } template void TestReplaceCellAtId(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); auto validate = [&](const vtkIdType cellId, bool reverse) { vtkIdType npts; const vtkIdType* pts; cellArray->GetCellAtId(cellId, npts, pts); TEST_ASSERT(ValidateCell(cellId, npts, pts, reverse)); }; validate(0, false); validate(1, false); validate(2, false); { auto id2Reverse = GetCellIds(2, true); cellArray->ReplaceCellAtId(2, id2Reverse); } validate(0, false); validate(1, false); validate(2, true); { auto id0 = GetCellIds(0, true); cellArray->ReplaceCellAtId(0, id0->GetNumberOfIds(), id0->GetPointer(0)); } validate(0, true); validate(1, false); validate(2, true); cellArray->ReplaceCellAtId(1, { 5, 4, 3 }); // reverse 3, 4, 5 validate(0, true); validate(1, true); validate(2, true); } template void TestGetMaxCellSize(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); auto ids0 = GetCellIds(0); auto ids1 = GetCellIds(1); auto ids2 = GetCellIds(2); TEST_ASSERT(cellArray->GetMaxCellSize() == 0); cellArray->InsertNextCell(ids0); TEST_ASSERT(cellArray->GetMaxCellSize() == ids0->GetNumberOfIds()); cellArray->InsertNextCell(ids1); TEST_ASSERT(cellArray->GetMaxCellSize() == ids0->GetNumberOfIds()); cellArray->InsertNextCell(ids2); TEST_ASSERT(cellArray->GetMaxCellSize() == ids2->GetNumberOfIds()); } template void TestDeepCopy(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); vtkNew other; other->DeepCopy(cellArray); TEST_ASSERT(cellArray->GetStorageType() == other->GetStorageType()); ValidateCellArray(other); cellArray->InsertNextCell({ 0, 1, 2 }); TEST_ASSERT(cellArray->GetNumberOfCells() == other->GetNumberOfCells() + 1); } template void TestShallowCopy(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); vtkNew other; other->ShallowCopy(cellArray); TEST_ASSERT(cellArray->GetStorageType() == other->GetStorageType()); ValidateCellArray(other); cellArray->InsertNextCell({ 0, 1, 2 }); TEST_ASSERT(cellArray->GetNumberOfCells() == other->GetNumberOfCells()); TEST_ASSERT(cellArray->GetOffsetsArray() == other->GetOffsetsArray()); TEST_ASSERT(cellArray->GetConnectivityArray() == other->GetConnectivityArray()); } template void TestAppendImpl(vtkSmartPointer first, vtkSmartPointer second) { FillCellArray(first, false); FillCellArray(second, true); vtkNew concat; concat->DeepCopy(first); concat->Append(second, 10); // add 10 to all point ids from second TEST_ASSERT(concat->GetNumberOfCells() == 6); auto validate = [&](const vtkIdType cellId, bool reverse, vtkIdType offset) { vtkIdType npts; const vtkIdType* pts; concat->GetCellAtId(cellId, npts, pts); vtkIdType cellIdQuery = cellId < 3 ? cellId : cellId % 3; TEST_ASSERT(ValidateCell(cellIdQuery, npts, pts, reverse, offset)); }; validate(0, false, 0); validate(1, false, 0); validate(2, false, 0); validate(3, true, 10); validate(4, true, 10); validate(5, true, 10); } template void TestAppend32(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TestAppendImpl(cellArray, CellArrayFactory::New()); } template void TestAppend64(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); TestAppendImpl(cellArray, CellArrayFactory::New()); } template void TestLegacyFormatImportExportAppend(vtkSmartPointer cellArray) { vtkLogScopeFunction(INFO); FillCellArray(cellArray); vtkNew legacy; cellArray->ExportLegacyFormat(legacy); { std::vector expected; for (int i = 0; i < 3; ++i) { auto ids = GetCellIds(i); expected.push_back(ids->GetNumberOfIds()); for (vtkIdType j = 0; j < ids->GetNumberOfIds(); ++j) { expected.push_back(ids->GetId(j)); } } auto legacyRange = vtk::DataArrayValueRange<1>(legacy); TEST_ASSERT(std::equal(expected.cbegin(), expected.cend(), legacyRange.cbegin())); } cellArray->Initialize(); cellArray->ImportLegacyFormat(legacy); auto validate = [&](const vtkIdType cellId, vtkIdType offset = 0) { vtkIdType npts; const vtkIdType* pts; cellArray->GetCellAtId(cellId, npts, pts); vtkIdType cellIdQuery = cellId < 3 ? cellId : cellId % 3; TEST_ASSERT(ValidateCell(cellIdQuery, npts, pts, false, offset)); }; TEST_ASSERT(cellArray->GetNumberOfCells() == 3); validate(0); validate(1); validate(2); // check that the next import doesn't have this cellArray->InsertNextCell(GetCellIds(0, true)); cellArray->ImportLegacyFormat(legacy->GetPointer(0), legacy->GetNumberOfTuples()); TEST_ASSERT(cellArray->GetNumberOfCells() == 3); validate(0); validate(1); validate(2); cellArray->AppendLegacyFormat(legacy, 10); TEST_ASSERT(cellArray->GetNumberOfCells() == 6); validate(0, 0); validate(1, 0); validate(2, 0); validate(3, 10); validate(4, 10); validate(5, 10); cellArray->AppendLegacyFormat(legacy->GetPointer(0), legacy->GetNumberOfTuples(), 20); TEST_ASSERT(cellArray->GetNumberOfCells() == 9); validate(0, 0); validate(1, 0); validate(2, 0); validate(3, 10); validate(4, 10); validate(5, 10); validate(6, 20); validate(7, 20); validate(8, 20); } const char* StorageTypeToString(vtkCellArray::StorageTypes storageType) { switch (storageType) { case vtkCellArray::Int64: return "Int64"; case vtkCellArray::Int32: return "Int32"; case vtkCellArray::FixedSizeInt64: return "FixedSizeInt64"; case vtkCellArray::FixedSizeInt32: return "FixedSizeInt32"; case vtkCellArray::Generic: default: return "Generic"; } } template void RunTests() { vtkLogScopeF(INFO, "Testing %s storage.", StorageTypeToString(StorageType)); TestAllocate(CellArrayFactory::New()); TestResize(CellArrayFactory::New()); TestInitialize(CellArrayFactory::New()); TestReset(CellArrayFactory::New()); if (!FixedSize) { // Squeeze is a no-op for fixed size storage. TestSqueeze(CellArrayFactory::New()); // Offsets can't be set manually for fixed size storage. TestIsValidOffsets(CellArrayFactory::New()); } TestIsValidConnectivity(CellArrayFactory::New()); TestGetNumberOfCells(CellArrayFactory::New()); TestGetNumberOfOffsets(CellArrayFactory::New()); TestGetNumberOfConnectivityIds(CellArrayFactory::New()); TestNewIterator(CellArrayFactory::New()); TestSetData(CellArrayFactory::New()); TestIsStorage64Bit(CellArrayFactory::New()); TestIsStorage32Bit(CellArrayFactory::New()); TestIsStorageFixedSize64Bit(CellArrayFactory::New()); TestIsStorageFixedSize32Bit(CellArrayFactory::New()); TestIsStorageGeneric(CellArrayFactory::New()); TestUse32BitStorage(CellArrayFactory::New()); TestUse64BitStorage(CellArrayFactory::New()); TestUseDefaultStorage(CellArrayFactory::New()); TestUseFixedSize32BitStorage(CellArrayFactory::New()); TestUseFixedSize64BitStorage(CellArrayFactory::New()); TestUseFixedSizeDefaultStorage(CellArrayFactory::New()); TestCanConvertTo32BitStorage(CellArrayFactory::New()); TestCanConvertTo64BitStorage(CellArrayFactory::New()); TestCanConvertToFixedSize32BitStorage(CellArrayFactory::New()); TestCanConvertToFixedSize64BitStorage(CellArrayFactory::New()); TestConvertTo32BitStorage(CellArrayFactory::New()); TestConvertTo64BitStorage(CellArrayFactory::New()); TestConvertToFixedSize32BitStorage(CellArrayFactory::New()); TestConvertToFixedSize64BitStorage(CellArrayFactory::New()); TestGetOffsetsArray(CellArrayFactory::New()); TestGetConnectivityArray(CellArrayFactory::New()); TestIsHomogeneous(CellArrayFactory::New()); TestTraversalSizePointer(CellArrayFactory::New()); TestTraversalIdList(CellArrayFactory::New()); TestGetCellAtId(CellArrayFactory::New()); TestGetCellSize(CellArrayFactory::New()); TestInsertNextCell(CellArrayFactory::New()); TestIncrementalCellInsertion(CellArrayFactory::New()); TestReverseCellAtId(CellArrayFactory::New()); TestReplaceCellAtId(CellArrayFactory::New()); TestGetMaxCellSize(CellArrayFactory::New()); TestDeepCopy(CellArrayFactory::New()); TestShallowCopy(CellArrayFactory::New()); TestAppend32(CellArrayFactory::New()); TestAppend64(CellArrayFactory::New()); TestLegacyFormatImportExportAppend( CellArrayFactory::New()); } } // end anon namespace