// 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', () {
      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(""));
    });
  });
}
