// 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 blob_test;
import '../../pkg/unittest/lib/unittest.dart';
import '../../pkg/unittest/lib/html_config.dart';
import 'dart:html';
import 'dart:typed_data';

main() {
  useHtmlConfiguration();

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

  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, (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, isZero);
    });

  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);
    });
}
