// Copyright (c) 2015, Google Inc. 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 vector_math.test.scalar_list_view_test;

import 'dart:typed_data';

import 'package:test/test.dart';

import 'package:vector_math/vector_math_lists.dart';

void testScalarListViewWithOffset() {
  final list = new ScalarListView(10, 1);
  list[0] = 1.0;
  expect(list[0], equals(1.0));
  expect(list.buffer[0], equals(0.0)); // unset
  expect(list.buffer[1], equals(1.0));
  expect(list.buffer[2], equals(0.0)); // unset
  expect(list.buffer[3], equals(0.0));
  expect(list.buffer[4], equals(0.0));
}

void testScalarListView() {
  final buffer = new Float32List(10);
  final list = new ScalarListView.view(buffer, 1, 4);
  expect(list.length, 2);
  list[0] = 1.0;
  list[1] = 4.0;
  expect(buffer[0], equals(0.0));
  expect(buffer[1], equals(1.0));
  expect(buffer[2], equals(0.0));
  expect(buffer[3], equals(0.0));
  expect(buffer[4], equals(0.0));
  expect(buffer[5], equals(4.0));
  expect(buffer[6], equals(0.0));
  expect(buffer[7], equals(0.0));
  expect(buffer[8], equals(0.0));
  expect(buffer[9], equals(0.0));
}

void testScalarListViewFromList() {
  List<double> input = new List<double>(3);
  input[0] = 1.0;
  input[1] = 4.0;
  input[2] = 7.0;
  final list = new ScalarListView.fromList(input, 2, 3);
  expect(list.buffer.length, 11);
  expect(list.buffer[0], 0.0);
  expect(list.buffer[1], 0.0);
  expect(list.buffer[2], 1.0);
  expect(list.buffer[3], 0.0);
  expect(list.buffer[4], 0.0);
  expect(list.buffer[5], 4.0);
  expect(list.buffer[6], 0.0);
  expect(list.buffer[7], 0.0);
  expect(list.buffer[8], 7.0);
  expect(list.buffer[9], 0.0);
  expect(list.buffer[10], 0.0);
}

void main() {
  group('ScalarListView', () {
    test('with offset', testScalarListViewWithOffset);
    test('view', testScalarListView);
    test('fromList', testScalarListViewFromList);
  });
}
