<!DOCTYPE html>
<html>
<head>
    <script src="../../resources/testharness.js"></script>
    <script src="../../resources/testharnessreport.js"></script>
</head>
<body>
<script>
    const originalIterator = Object.getOwnPropertyDescriptor(Array.prototype, Symbol.iterator);

    test(() => {
      let callCount = 0;
      let array = [2.0, 0.0, 0.0, 2.0, 10.0, 10.0];
      Object.defineProperty(array, Symbol.iterator, {
        get() {
          ++callCount;
          return originalIterator.value;
        }
      });
      
      let matrix = new DOMMatrix(array);
      
      assert_equals(callCount, 1, "@@iterator must only be accessed once.");
      assert_equals(matrix.toString(), "matrix(2, 0, 0, 2, 10, 10)", "DOMMatrix constructor should work correctly.");
    }, "@@iterator should only be accessed once, tested via replacement of @@iterator on instance.");

    test((t) => {
      t.add_cleanup(() => {
        Object.defineProperty(Array.prototype, Symbol.iterator, originalIterator);
      });

      let callCount = 0;
      const array = [2.0, 0.0, 0.0, 2.0, 10.0, 10.0];
      Object.defineProperty(Array.prototype, Symbol.iterator, {
        get() {
          ++callCount;
          return originalIterator.value;
        }
      });

      let matrix = new DOMMatrix(array);

      assert_equals(callCount, 1, "@@iterator must only be accessed once.");
      assert_equals(matrix.toString(), "matrix(2, 0, 0, 2, 10, 10)", "DOMMatrix constructor should work correctly.");
     }, "@@iterator should only be accessed once, tested via replacement of @@iterator on prototype.");
</script>
</body>
</html>
