//
// Make sure `safe_allocation` can be used to create a two-dimensional array.
//
// Note that we don't really recommend using that representation for two
// dimensional arrays because other representations are better, but it
// should at least work.
//

#include <libkern/c++/safe_allocation.h>
#include <darwintest.h>
#include "test_utils.h"

struct T {
	int i;
};

template <typename T>
static void
tests()
{
	test_safe_allocation<test_safe_allocation<int> > array(10, libkern::allocate_memory);

	for (int i = 0; i < 10; i++) {
		array[i] = test_safe_allocation<int>(10, libkern::allocate_memory);
		for (int j = 0; j < 10; ++j) {
			array[i][j] = i + j;
		}
	}

	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; ++j) {
			CHECK(array[i][j] == i + j);
		}
	}
}

T_DECL(usage_two_dimensions, "safe_allocation.usage.two_dimensions", T_META_TAG_VM_PREFERRED) {
	tests<T>();
}
