// Copyright (c) 2013, 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.
// VMOptions=--optimization-counter-threshold=10 --no-background-compilation

// @dart = 2.9

// Library tag to be able to run in html test framework.
library uint32x4_shuffle_test;

import 'dart:typed_data';
import "package:expect/expect.dart";

void testShuffle() {
  var m = new Int32x4(1, 2, 3, 4);
  var c;
  c = m.shuffle(Int32x4.wzyx);
  Expect.equals(4, c.x);
  Expect.equals(3, c.y);
  Expect.equals(2, c.z);
  Expect.equals(1, c.w);
}

void testShuffleNonConstant(mask) {
  var m = new Int32x4(1, 2, 3, 4);
  var c;
  c = m.shuffle(mask);
  if (mask == 1) {
    Expect.equals(2, c.x);
    Expect.equals(1, c.y);
    Expect.equals(1, c.z);
    Expect.equals(1, c.w);
  } else {
    Expect.equals(Int32x4.yyyy + 1, mask);
    Expect.equals(3, c.x);
    Expect.equals(2, c.y);
    Expect.equals(2, c.z);
    Expect.equals(2, c.w);
  }
}

void testShuffleMix() {
  var m = new Int32x4(1, 2, 3, 4);
  var n = new Int32x4(5, 6, 7, 8);
  var c = m.shuffleMix(n, Int32x4.xyxy);
  Expect.equals(1, c.x);
  Expect.equals(2, c.y);
  Expect.equals(5, c.z);
  Expect.equals(6, c.w);
}

main() {
  var xxxx = Int32x4.xxxx + 1;
  var yyyy = Int32x4.yyyy + 1;
  for (int i = 0; i < 20; i++) {
    testShuffle();
    testShuffleNonConstant(xxxx);
    testShuffleNonConstant(yyyy);
    testShuffleMix();
  }
}
