<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>FileAPI Test: filereader_readAsText</title>
    <link rel="author" title="Intel" href="http://www.intel.com">
    <link rel="help" href="http://dev.w3.org/2006/webapi/FileAPI/#readAsDataText">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <div id="log"></div>

    <script>
    async_test(function() {
      var blob = new Blob(["TEST"]);
      var reader = new FileReader();

      reader.onload = this.step_func(function(evt) {
        assert_equals(typeof reader.result, "string", "The result is typeof string");
        assert_equals(reader.result, "TEST", "The result is TEST");
        this.done();
      });

      reader.onloadstart = this.step_func(function(evt) {
        assert_equals(reader.readyState, reader.LOADING, "The readyState");
      });

      reader.onprogress = this.step_func(function(evt) {
        assert_equals(reader.readyState, reader.LOADING);
      });

      reader.readAsText(blob);
    }, "readAsText should correctly read UTF-8.");

    async_test(function() {
      var blob = new Blob(["TEST"]);
      var reader = new FileReader();
      var reader_UTF16 = new FileReader();
      reader_UTF16.onload = this.step_func(function(evt) {
        // "TEST" in UTF-8 is 0x54 0x45 0x53 0x54.
        // Decoded as utf-16 (little-endian), we get 0x4554 0x5453.
        assert_equals(reader_UTF16.readyState, reader.DONE, "The readyState");
        assert_equals(reader_UTF16.result, "\u4554\u5453", "The result is not TEST");
        this.done();
      });
      reader_UTF16.readAsText(blob, "UTF-16");
    }, "readAsText should correctly read UTF-16.");
    </script>
  </body>
</html>
