// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:engine_tool/src/label.dart';
import 'package:litetest/litetest.dart';

void main() {
  group('Label', () {
    test('rejects relative paths', () {
      expect(() => Label.parse('../foo/bar'), throwsFormatException);
      expect(() => Label.parse('./foo/bar'), throwsFormatException);
      expect(() => Label.parse('foo/bar'), throwsFormatException);
    });

    test('rejects starting with a number', () {
      expect(() => Label.parse('//foo/1bar'), throwsFormatException);
      expect(() => Label.parse('//foo/bar:1baz'), throwsFormatException);
    });

    test('rejects other invalid characters', () {
      expect(() => Label.parse('//foo/bar!baz'), throwsFormatException);
      expect(() => Label.parse('//foo/bar:baz!'), throwsFormatException);
    });

    test('rejects ending with a slash', () {
      expect(() => Label.parse('//foo/bar/'), throwsFormatException);
      expect(() => Label.parse('//foo/bar:baz/'), throwsFormatException);
    });

    test('rejects empty target name', () {
      expect(() => Label.parse('//foo:'), throwsFormatException);
    });

    test('rejects empty package name', () {
      expect(() => Label.parse(':bar'), throwsFormatException);
    });

    test('parses valid labels', () {
      expect(Label.parse('//foo/bar'), Label('//foo/bar'));
    });

    test('parses valid labels with target', () {
      expect(Label.parse('//foo/bar:baz'), Label('//foo/bar', 'baz'));
    });

    test('parses valid labels with underscores', () {
      expect(Label.parse('//foo/bar_:_baz'), Label('//foo/bar_', '_baz'));
    });

    test('parses the GN format', () {
      expect(Label.parseGn('//foo/bar'), Label('//foo/bar'));
      expect(Label.parseGn('//foo/bar:baz'), Label('//foo/bar', 'baz'));
    });

    test('converts to string', () {
      expect(Label('//foo/bar').toString(), '//foo/bar:bar');
      expect(Label('//foo/bar', 'baz').toString(), '//foo/bar:baz');
    });

    test('converst to the ninja format', () {
      expect(Label('//foo/bar').toNinjaLabel(), 'foo/bar:bar');
      expect(Label('//foo/bar', 'baz').toNinjaLabel(), 'foo/bar:baz');
    });
  });

  group('TargetPattern', () {
    test('parses a valid label', () {
      expect(TargetPattern.parse('//foo/bar'), TargetPattern('//foo/bar'));
      expect(TargetPattern.parse('//foo/bar:baz'), TargetPattern('//foo/bar', 'baz'));
    });

    test('parses a wildcard package', () {
      final TargetPattern result = TargetPattern.parse('//foo/...');
      expect(result, TargetPattern('//foo/...'));
      expect(result.target, isNull);
    });

    test('parses a wildcard target', () {
      expect(TargetPattern.parse('//foo/bar:all'), TargetPattern('//foo/bar', 'all'));
    });

    test('converts to string', () {
      expect(TargetPattern('//foo/bar').toString(), '//foo/bar:bar');
      expect(TargetPattern('//foo/bar', 'baz').toString(), '//foo/bar:baz');
    });

    test('converts to the GN format', () {
      expect(TargetPattern('//foo/bar/...').toGnPattern(), 'foo/bar/*');
      expect(TargetPattern('//foo/bar', 'baz').toGnPattern(), 'foo/bar:baz');
      expect(TargetPattern('//foo/bar', 'all').toGnPattern(), 'foo/bar:*');
    });
  });
}
