Unit tests
After Toby Speight'comment, I have realized that test could be helpful here. Here is the current tests using MSVC 2017 test framework
#include "stdafx.h"
#include "CppUnitTest.h"
#include "../mdynarray/mdynarray.h"
using namespace Microsoft::VisualStudio::CppUnitTestFramework;
namespace UnitTest1
{
using namespace DynArray;
TEST_CLASS(UnitTest1)
{
public:
TEST_METHOD(useArr)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreSame(dynarray[i][j][k], arr[l++]);
}
}
}
}
TEST_METHOD(copyArr)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynCopyArray(arr, 3, 4, 5);
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreEqual(dynarray[i][j][k], arr[l]);
Assert::AreNotSame(dynarray[i][j][k], arr[l]);
l++;
}
}
}
}
TEST_METHOD(buildArr)
{
ArrayBuilder<int> builder;
auto dynarray = builder.dynBuildArray(3, 4, 5);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreEqual(dynarray[i][j][k], 0);
}
}
}
}
TEST_METHOD(copyCtor)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
auto dyn2 = dynarray;
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreEqual(dyn2[i][j][k], arr[l]);
Assert::AreNotSame(dyn2[i][j][k], arr[l]);
l++;
}
}
}
}
TEST_METHOD(moveCtor)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
auto dyn2 = std::move(dynarray);
Assert::AreEqual(dynarray.size(), 0u);
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreSame(dyn2[i][j][k], arr[l]);
l++;
}
}
}
}
TEST_METHOD(copyAssign)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
auto dyn2 = builder.dynBuildArray(3, 4, 5);
dyn2 = dynarray;
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreEqual(dyn2[i][j][k], arr[l]);
Assert::AreNotSame(dyn2[i][j][k], arr[l]);
l++;
}
}
}
}
TEST_METHOD(moveAssign)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
auto dyn2 = builder.dynBuildArray(3, 4, 5);
dyn2 = std::move(dynarray);
Assert::AreEqual(dynarray[1][1][1], 0); // Beware implementation test
l = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) {
for (int k = 0; k < 5; k++) {
Assert::AreSame(dyn2[i][j][k], arr[l]);
l++;
}
}
}
}
TEST_METHOD(nonConstIter)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
l = 0;
for (auto& it1 : dynarray) {
for (auto& it2 : it1) {
for (auto& it3 : it2) {
Assert::AreSame(it3, arr[l]);
l++;
it3 = l; // control it is not const...
}
}
}
}
TEST_METHOD(constIter)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
l = 0;
for (auto it1 = dynarray.cbegin(); it1 != dynarray.cend(); it1++) {
for (auto it2 = it1->cbegin(); it2 != it1->cend(); it2++) {
for (auto it3 = it2->cbegin(); it3 != it2->cend(); it3++) {
Assert::AreSame(*it3, arr[l]);
l++;
// *it3 = l; // does not compile
}
}
}
}
TEST_METHOD(convConstIterator)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
auto it = dynarray.begin();
MDynArray<int, 3>::const_iterator cit = it;
//it = (MDynArray<int, 3>::iterator) cit; // does not compile
it += 1;
cit += 1;
Assert::IsTrue(it > dynarray.begin());
Assert::IsTrue(it == cit);
Assert::IsTrue(cit == it);
}
TEST_METHOD(revIterator)
{
ArrayBuilder<int> builder;
int arr[60];
int l = 0;
for (int& i : arr) {
i = l++;
}
auto dynarray = builder.dynUseArray(arr, 3, 4, 5);
l = 0;
for (auto it1 = dynarray.rbegin(); it1 != dynarray.rend(); it1++) {
for (auto it2 = it1->rbegin(); it2 != it1->rend(); it2++) {
for (auto it3 = it2->rbegin(); it3 != it2->rend(); it3++) {
Assert::AreSame(*it3, arr[59 - l]);
l++;
*it3 = l; // control non constness
}
}
}
}
};
}