/*
 * Copyright (c) 2014, 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.
 */
/**
 * @description Test using FileWriter.seek to write overlapping existing data
 * in a file.
 */
import "dart:html";
import "../../testcommon.dart";
import "../../../Utils/async_utils.dart";
import "resources/file-writer-utils.dart";

main() {
  document.body.appendHtml('<div id="console"></div>',
      treeSanitizer: NodeTreeSanitizer.trusted);

  var fileEntry;
  var fileWriter;
  var testData = "Lorem ipsum";
  var seekBackwardOffset = -4;
  var seekForwardOffset = 4;

  onTestSucceeded()
  {
    testPassed("All writes verified.");
    cleanUp();
  }

  validateNonextendingWriteEnd() {
    verifyByteRangeAsString(fileEntry, testData.length + seekForwardOffset, testData.substring(seekForwardOffset), onTestSucceeded);
  }

  validateNonextendingWriteStart() {
    testPassed("Nonextending write validated.");
    shouldBeTrue(fileWriter.length == testData.length * 2);
    verifyByteRangeAsString(fileEntry, 0, testData.substring(0, seekForwardOffset), validateNonextendingWriteEnd);
  }

  testNonextendingWrite() {
    writeString(fileEntry, fileWriter, seekForwardOffset, testData, validateNonextendingWriteStart);
  }

  setupNonextendingWrite() {
    testPassed("Positive seek validated.");
    setFileContents(fileEntry, fileWriter, testData + testData, testNonextendingWrite);
  }

  validateSeekForward() {
    shouldBeTrue(fileWriter.length == testData.length + seekForwardOffset);
    verifyByteRangeAsString(fileEntry, 0, testData.substring(0, seekForwardOffset), setupNonextendingWrite);
  }

  testSeekForward() {
    writeString(fileEntry, fileWriter, seekForwardOffset, testData, validateSeekForward);
  }

  setupSeekForward() {
    testPassed("Negative seek validated.");
    setFileContents(fileEntry, fileWriter, testData, testSeekForward);
  }

  validateSeekBackward() {
    shouldBeTrue(fileWriter.length == 2 * testData.length + seekBackwardOffset);
    verifyByteRangeAsString(fileEntry, 0, testData.substring(0, testData.length + seekBackwardOffset), setupSeekForward);
  }

  testSeekBackward() {
    writeString(fileEntry, fileWriter, seekBackwardOffset, testData, validateSeekBackward);
  }

  // Each test has 3 phases: setup, execution, and validation.  In the setup phase, we make sure that there's a FileWriter pointing at a file with appropriate
  // data for the test we want to run.  In the execution phase, we do a seek and a write, and the utility  that does those also validates that the data
  // actually got written.  So in the validation phase, we only have to check that the rest of the file didn't get corrupted while we were writing our bit.
  runTest(fileEntryIn, fileWriterIn) {
    fileEntry = fileEntryIn;
    fileWriter = fileWriterIn;
    setFileContents(fileEntry, fileWriter, testData, testSeekBackward);
  }

  setupAndRunTest(1024, 'file-writer-truncate-extend', runTest);
}
