// 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.

import 'dart:html';
import 'dart:typed_data';

import 'package:expect/legacy/minitest.dart'; // ignore: deprecated_member_use_from_same_package

main() {
  test('basic', () {
    var b = new Blob([]);
    expect(b.size, 0);
  });

  test('type1', () {
    // OPTIONALS var b = new Blob(['Harry'], type: 'text');
    var b = new Blob(['Harry'], 'text');
    expect(b.size, 5);
    expect(b.type, 'text');
  });

  test('endings1', () {
    // OPTIONALS var b = new Blob(['A\nB\n'], endings: 'transparent');
    var b = new Blob(['A\nB\n'], null, 'transparent');
    expect(b.size, 4);
  });

  test('endings2', () {
    // OPTIONALS var b = new Blob(['A\nB\n'], endings: 'native');
    var b = new Blob(['A\nB\n'], null, 'native');
    expect(
      b.size,
      predicate((x) => x == 4 || x == 6),
      reason: "b.size should be 4 or 6",
    );
  });

  test('twoStrings', () {
    // OPTIONALS var b = new Blob(['123', 'xyz'], type: 'text/plain;charset=UTF-8');
    var b = new Blob(['123', 'xyz'], 'text/plain;charset=UTF-8');
    expect(b.size, 6);
  });

  test('fromBlob1', () {
    var b1 = new Blob([]);
    var b2 = new Blob([b1]);
    expect(b2.size, 0);
  });

  test('fromBlob2', () {
    var b1 = new Blob(['x']);
    var b2 = new Blob([b1, b1]);
    expect(b1.size, 1);
    expect(b2.size, 2);
  });

  test('fromArrayBuffer', () {
    var a = new Uint8List(100).buffer; // i.e. new ArrayBuffer(100);
    var b = new Blob([a, a]);
    expect(b.size, 200);
  });
}
