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

library dart_style.test.source_code_test;

import 'package:unittest/unittest.dart';

import 'package:dart_style/dart_style.dart';

void main() {
  var selection = new SourceCode("123456;",
      selectionStart: 3, selectionLength: 2);
  var noSelection = new SourceCode("123456;");

  group('constructor', () {
    test('throws on negative start', () {
      expect(() {
        new SourceCode("12345;", selectionStart: -1, selectionLength: 0);
      }, throwsArgumentError);
    });

    test('throws on out of bounds start', () {
      expect(() {
        new SourceCode("12345;", selectionStart: 7, selectionLength: 0);
      }, throwsArgumentError);
    });

    test('throws on negative length', () {
      expect(() {
        new SourceCode("12345;", selectionStart: 1, selectionLength: -1);
      }, throwsArgumentError);
    });

    test('throws on out of bounds length', () {
      expect(() {
        new SourceCode("12345;", selectionStart: 2, selectionLength: 5);
      }, throwsArgumentError);
    });

    test('throws is start is null and length is not', () {
      expect(() {
        new SourceCode("12345;", selectionStart: 0);
      }, throwsArgumentError);
    });

    test('throws is length is null and start is not', () {
      expect(() {
        new SourceCode("12345;", selectionLength: 1);
      }, throwsArgumentError);
    });
  });

  group('textBeforeSelection', () {
    test('gets substring before selection', () {
      expect(selection.textBeforeSelection, equals("123"));
    });

    test('gets entire string if no selection', () {
      var code = new SourceCode("123456;");
      expect(noSelection.textBeforeSelection, equals("123456;"));
    });
  });

  group('selectedText', () {
    test('gets selection substring', () {
      expect(selection.selectedText, equals("45"));
    });

    test('gets empty string if no selection', () {
      expect(noSelection.selectedText, equals(""));
    });
  });

  group('textAfterSelection', () {
    test('gets substring after selection', () {
      expect(selection.textAfterSelection, equals("6;"));
    });

    test('gets empty string if no selection', () {
      expect(noSelection.textAfterSelection, equals(""));
    });
  });
}
