var arrayref = require("arrayref");

// Setting a variable that is a reference to an array copies into the array it refers to.
if (arrayref.numbers_sum() !== 10)
  throw new Error("numbers_sum");
arrayref.numbers_ref = arrayref.others_address();
if (arrayref.numbers_sum() !== 100)
  throw new Error("numbers_sum after set");

// An array of char is a string here, and so is a reference to one.
if (arrayref.letters !== "abc")
  throw new Error("letters");
if (arrayref.letters_ref !== "abc")
  throw new Error("letters_ref");
arrayref.letters_ref = "xy";
if (arrayref.letters_are() !== "xy")
  throw new Error("letters_are");
if (arrayref.frozen_ref !== "xyz")
  throw new Error("frozen_ref");

// A reference to an array of char cannot be null.
if (arrayref.length_of("abc") !== 3)
  throw new Error("length_of");
var threw = false;
try {
  arrayref.length_of(null);
} catch (e) {
  threw = true;
}
if (!threw)
  throw new Error("length_of(null) did not throw");

var member = new arrayref.ArrayRefMember();
if (member.sum() !== 10)
  throw new Error("member sum");
if (member.text_ref !== "hi")
  throw new Error("member text_ref");
member.text_ref = "bye";
if (member.text_is() !== "bye")
  throw new Error("member text_is");

// Setting a reference to an array of arrays copies every element.
arrayref.grid_ref = arrayref.other_grid_address();
if (arrayref.grid_element(0, 1) !== 20)
  throw new Error("grid_element(0, 1)");
if (arrayref.grid_element(1, 2) !== 60)
  throw new Error("grid_element(1, 2)");

var grid_member = new arrayref.GridRefMember();
grid_member.rows_ref = arrayref.other_grid_address();
if (grid_member.element(0, 1) !== 20)
  throw new Error("grid member element(0, 1)");
if (grid_member.element(1, 2) !== 60)
  throw new Error("grid member element(1, 2)");
