# 1) allocate memory

a = malloc(12);

if (!is_resource(a)) exit(1);


# 2) check memory writability

a = malloc(42);
b = is_rw(a);

if (!b) exit(2);


# 3) free memory

a = malloc(42);
free(a);
b = msize(a);

if (b != 0) exit(3);


# 4) writability of freed resource

a = malloc(42);
free(a);
b = is_rw(a);

if (b) exit(4);


# 5) mputchar and mgetchar

a = malloc(1);
for (i = 0; i < 10; i++) {
  mputchar(a, i, i * 10);
}
ok = true;
for (i = 0; i < 10; i++) {
  ok = ok && (mgetchar(a, i) == i * 10);
}
b = mgetchar(a, 10);
c = msize(a);

if (!ok || !is_void(b) || c != 10) exit(5);


# 6) mputshort and mgetshort

a = malloc(1);
for (i = 0; i < 10; i++) {
  mputshort(a, i * 4, i * 10);
}
ok = true;
for (i = 0; i < 10; i++) {
  ok = ok && (mgetshort(a, i * 4) == i * 10);
}
b = mgetshort(a, 10 * 4);

if (!ok || !is_void(b)) exit(6);


# 7) mputint and mgetint

a = malloc(1);
for (i = 0; i < 10; i++) {
  mputint(a, i * 8, i * 10);
}
ok = true;
for (i = 0; i < 10; i++) {
  ok = ok && (mgetint(a, i * 8) == i * 10);
}
b = mgetshort(a, 10 * 8);

if (!ok || !is_void(b)) exit(7);


# 8) cnull

a = cnull();
b = msize(a);
c = is_rw(a);

if (b != 0 || c) exit(8);


# 9) cstring

a = cstring("foobar");
b = msize(a);
c = is_rw(a);

if (b != 7 || !c) exit(9);


# 10) mstring

a = cstring("foobar");
b = mstring(a, 0);
c = mstring(a, 3);

if (b != "foobar" || c != "bar") exit(10);


# 11) mputptr and mgetptr

a = malloc(1);
b = cstring("foobar");
mputptr(a, 0, b);
c = mgetptr(a, 0, false);
d = mstring(c, 0);

if (d != "foobar") exit(11);


# 12) calloc

a = calloc(10, 10);
ok = true;
for (i = 0; i < 100; i++) {
  ok = ok && (mgetchar(a, i) == 0);
}
b = msize(a);

if (!ok || b != 100) exit(12);


print("12 subtests ");
