// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

library TypedArraysRangeCheckTest;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';

main() {
  useHtmlConfiguration();

  // Only perform tests if ArrayBuffer is supported.
  if (!ArrayBuffer.supported) {
    return;
  }

  test('outOfRangeAccess_dynamic', () {
      var a = new Uint8Array(1024);

      expect(a[a.length], isNull);
      expect(a[a.length + 1], isNull);
      expect(a[a.length + 1024], isNull);

      // expect(a[-1], isNull);
      // expect(a[-2], isNull);
      // expect(a[-1024], isNull);

      // It's harder to test out of range setters, but let's do some minimum.
      a[a.length] = 0xdeadbeaf;
      a[a.length + 1] = 0xdeadbeaf;
      a[a.length + 1024] = 0xdeadbeaf;

      // a[-1] = 0xdeadbeaf;
      // a[-2] = 0xdeadbeaf;
      // a[-1024] = 0xdeadbeaf;
  });

  test('outOfRange_typed', () {
      Uint8Array a = new Uint8Array(1024);

      expect(a[a.length], isNull);
      expect(a[a.length + 1], isNull);
      expect(a[a.length + 1024], isNull);

      // expect(a[-1], isNull);
      // expect(a[-2], isNull);
      // expect(a[-1024], isNull);

      // It's harder to test out of range setters, but let's do some minimum.
      a[a.length] = 0xdeadbeaf;
      a[a.length + 1] = 0xdeadbeaf;
      a[a.length + 1024] = 0xdeadbeaf;

      // a[-1] = 0xdeadbeaf;
      // a[-2] = 0xdeadbeaf;
      // a[-1024] = 0xdeadbeaf;
  });
}
