// Copyright (c) 2019, 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.

// @dart = 2.9

// VMOptions=--deterministic

import "package:expect/expect.dart";

import 'dart:typed_data';

// Found by "value-guided" DartFuzzing: incorrect clamping.
// https://github.com/dart-lang/sdk/issues/37868
@pragma("vm:never-inline")
foo(List<int> x) => Uint8ClampedList.fromList(x);

@pragma("vm:never-inline")
bar(List<int> x) => Uint8List.fromList(x);

@pragma("vm:never-inline")
baz(List<int> x) => Int8List.fromList(x);

main() {
  // Proper values.
  final List<int> x = [
    9223372036854775807,
    -9223372036854775808,
    9223372032559808513,
    -9223372032559808513,
    5000000000,
    -5000000000,
    2147483647,
    -2147483648,
    255,
    -255,
    11,
    -11,
    0,
    -1,
  ];
  Expect.listEquals(
      [255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 11, 0, 0, 0], foo(x));
  Expect.listEquals(
      [255, 0, 1, 255, 0, 0, 255, 0, 255, 1, 11, 245, 0, 255], bar(x));
  Expect.listEquals([-1, 0, 1, -1, 0, 0, -1, 0, -1, 1, 11, -11, 0, -1], baz(x));

  // Hidden null.
  final List<int> a = [1, null, 2];
  int num_exceptions = 0;
  try {
    foo(a);
  } on NoSuchMethodError catch (e) {
    num_exceptions++;
  }
  try {
    bar(a);
  } on NoSuchMethodError catch (e) {
    num_exceptions++;
  }
  try {
    baz(a);
  } on NoSuchMethodError catch (e) {
    num_exceptions++;
  }
  Expect.equals(3, num_exceptions);
}
