// Copyright 2019 PDFium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Treat two distinct objects with the same members as equal, e.g. in JS
// ([0, 1] == [0, 1]) evaluates to false. Without this function, we can't
// supply an expected result of object/array type for our tests.
function kindaSortaEqual(arg1, arg2) {
  if (arg1 == arg2) {
    return true;
  }
  if (typeof arg1 != "object") {
    return false;
  }
  if (typeof arg2 != "object") {
    return false;
  }
  return arg1.toString() == arg2.toString();
}

function testReadProperty(that, prop, expected) {
  try {
    var actual = that[prop];
    if (kindaSortaEqual(actual, expected)) {
      app.alert('PASS: ' + prop + ' = ' + actual);
    } else {
      app.alert('FAIL: ' + prop + ' = ' + actual + ', expected = ' + expected);
    }
  } catch (e) {
    app.alert('ERROR: ' + e.toString());
  }
}

function testUnreadableProperty(that, prop) {
  try {
    var value = that[prop];
    app.alert('FAIL: ' + prop + ', expected to throw');
  } catch (e) {
    app.alert('PASS: ' + prop + ' threw ' + e.toString());
  }
}

function testWriteProperty(that, prop, newValue) {
  try {
    that[prop] = newValue;
    var actual = that[prop];
    if (kindaSortaEqual(actual, newValue)) {
      app.alert('PASS: ' + prop + ' = ' + actual);
    } else {
      app.alert('FAIL: ' + prop + ' = ' + actual + ', expected = ' + newValue);
    }
  } catch (e) {
    app.alert('ERROR: ' + e.toString());
  }
}

function testWriteIgnoredProperty(that, prop, expected, newValue) {
  try {
    that[prop] = newValue;
    var actual = that[prop];
    if (kindaSortaEqual(actual, expected)) {
      app.alert('PASS: ' + prop + ' = ' + actual);
    } else {
      app.alert('FAIL: ' + prop + ' = ' + actual + ', expected = ' + expected);
    }
  } catch (e) {
    app.alert('ERROR: ' + e.toString());
  }
}

function testUnwritableProperty(that, prop, newValue) {
  try {
    that[prop] = newValue;
    app.alert('FAIL: ' + prop + ' = ' + newValue + ', expected to throw');
  } catch (e) {
    app.alert('PASS: ' + prop + ' threw ' + e.toString());
  }
}

function testRWProperty(that, prop, expected, newValue) {
  testReadProperty(that, prop, expected);
  testWriteProperty(that, prop, newValue);
}

function testRIProperty(that, prop, expected, newValue) {
  testReadProperty(that, prop, expected);
  testWriteIgnoredProperty(that, prop, expected, newValue);
}

function testROProperty(that, prop, expected) {
  testReadProperty(that, prop, expected);
  testUnwritableProperty(that, prop, 42);
}

function testXXProperty(that, prop) {
  testUnreadableProperty(that, prop);
  testUnwritableProperty(that, prop, 42);
}
