| // Copyright (c) 2026, 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 used in the LICENSE file. | |
| import 'package:analysis_server/src/plugin/dsatur.dart'; | |
| import 'package:analyzer/src/analysis_options/analysis_options.dart'; | |
| import 'package:test/test.dart'; | |
| import 'package:test_reflective_loader/test_reflective_loader.dart'; | |
| void main() { | |
| defineReflectiveSuite(() { | |
| defineReflectiveTests(DsaturTest); | |
| }); | |
| } | |
| @reflectiveTest | |
| class DsaturTest { | |
| void test_conflict_differentGitRefs() { | |
| var v1 = PluginSpecVertex('v1', [ | |
| _git('a', 'https://github.com/user/repo.git', ref: 'v1.0.0'), | |
| ]); | |
| var v2 = PluginSpecVertex('v2', [ | |
| _git('a', 'https://github.com/user/repo.git', ref: 'v2.0.0'), | |
| ]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_conflict_differentPaths() { | |
| var v1 = PluginSpecVertex('v1', [_path('a', '/path/to/a')]); | |
| var v2 = PluginSpecVertex('v2', [_path('a', '/path/to/b')]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_conflict_differentPubVersions() { | |
| var v1 = PluginSpecVertex('v1', [_versioned('a', '^1.0.0')]); | |
| var v2 = PluginSpecVertex('v2', [_versioned('a', '^2.0.0')]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_conflict_fiveSpecs_makeThreeGroups() { | |
| var v1 = PluginSpecVertex('v1', [_versioned('a', '^1.0.0')]); | |
| var v2 = PluginSpecVertex('v2', [ | |
| _versioned('a', '^1.0.0'), | |
| _versioned('b', '^2.0.0'), | |
| ]); | |
| var v3 = PluginSpecVertex('v3', [_versioned('a', '^2.0.0')]); | |
| var v4 = PluginSpecVertex('v4', [_versioned('a', '^2.0.0')]); | |
| var v5 = PluginSpecVertex('v5', [_versioned('c', '^3.0.0')]); | |
| var groups = groupVerticesMinimal([v1, v2, v3, v4, v5]); | |
| expect(groups, hasLength(3)); | |
| var groupForV1 = groups.firstWhere((g) => g.contains(v1)); | |
| expect(groupForV1, contains(v2)); | |
| expect(groupForV1, hasLength(2)); | |
| var groupForV3 = groups.firstWhere((g) => g.contains(v3)); | |
| expect(groupForV3, contains(v4)); | |
| expect(groupForV3, hasLength(2)); | |
| var groupForV5 = groups.firstWhere((g) => g.contains(v5)); | |
| expect(groupForV5, hasLength(1)); | |
| } | |
| void test_conflict_noSubset() { | |
| var v1 = PluginSpecVertex('v1', [_versioned('a', '^1.0.0')]); | |
| var v2 = PluginSpecVertex('v2', [_versioned('b', '^2.0.0')]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_conflict_pathVsVersioned() { | |
| var v1 = PluginSpecVertex('v1', [_path('a', '/path/to/a')]); | |
| var v2 = PluginSpecVertex('v2', [_versioned('a', '^1.0.0')]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_conflict_versionedDifferentHosts() { | |
| var v1 = PluginSpecVertex('v1', [_versioned('a', '^1.0.0')]); | |
| var v2 = PluginSpecVertex('v2', [ | |
| _versioned('a', '^1.0.0', hostedUrl: 'https://custom.pub.dev'), | |
| ]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(2)); | |
| } | |
| void test_empty() { | |
| var groups = groupVerticesMinimal([]); | |
| expect(groups, isEmpty); | |
| } | |
| void test_noConflict_subset() { | |
| var v1 = PluginSpecVertex('v1', [_versioned('a', '^1.0.0')]); | |
| var v2 = PluginSpecVertex('v2', [ | |
| _versioned('a', '^1.0.0'), | |
| _versioned('b', '^2.0.0'), | |
| ]); | |
| var groups = groupVerticesMinimal([v1, v2]); | |
| expect(groups, hasLength(1)); | |
| expect(groups[0], containsAll([v1, v2])); | |
| } | |
| PluginConfiguration _git( | |
| String name, | |
| String url, { | |
| String? ref, | |
| String? path, | |
| }) { | |
| return PluginConfiguration( | |
| name: name, | |
| source: GitPluginSource(url: url, ref: ref, path: path), | |
| ); | |
| } | |
| PluginConfiguration _path(String name, String path) { | |
| return PluginConfiguration( | |
| name: name, | |
| source: PathPluginSource(path: path), | |
| ); | |
| } | |
| PluginConfiguration _versioned( | |
| String name, | |
| String constraint, { | |
| String? hostedUrl, | |
| }) { | |
| return PluginConfiguration( | |
| name: name, | |
| source: VersionedPluginSource( | |
| constraint: constraint, | |
| hostedUrl: hostedUrl, | |
| ), | |
| ); | |
| } | |
| } |