import 'dart:ffi'; import 'dart:io'; import 'package:libgit2dart/libgit2dart.dart'; import 'package:test/test.dart'; import 'helpers/util.dart'; void main() { const testMailmap = """ # Simple Comment line Some Dude nick1 Other Author nick2 Other Author Phil Hill # Comment at end of line Joseph Santa Claus """; const testEntries = [ { 'realName': null, 'realEmail': "cto@company.xx", 'name': null, 'email': "cto@coompany.xx", }, { 'realName': "Some Dude", 'realEmail': "some@dude.xx", 'name': "nick1", 'email': "bugs@company.xx", }, { 'realName': "Other Author", 'realEmail': "other@author.xx", 'name': "nick2", 'email': "bugs@company.xx", }, { 'realName': "Other Author", 'realEmail': "other@author.xx", 'name': null, 'email': "nick2@company.xx", }, { 'realName': "Phil Hill", 'realEmail': null, 'name': null, 'email': "phil@company.xx", }, { 'realName': null, 'realEmail': "joseph@company.xx", 'name': "Joseph", 'email': "bugs@company.xx", }, { 'realName': "Santa Claus", 'realEmail': "santa.claus@northpole.xx", 'name': null, 'email': "me@company.xx", }, ]; const testResolve = [ { 'realName': "Brad", 'realEmail': "cto@company.xx", 'name': "Brad", 'email': "cto@coompany.xx", }, { 'realName': "Brad L", 'realEmail': "cto@company.xx", 'name': "Brad L", 'email': "cto@coompany.xx", }, { 'realName': "Some Dude", 'realEmail': "some@dude.xx", 'name': "nick1", 'email': "bugs@company.xx", }, { 'realName': "Other Author", 'realEmail': "other@author.xx", 'name': "nick2", 'email': "bugs@company.xx", }, { 'realName': "nick3", 'realEmail': "bugs@company.xx", 'name': "nick3", 'email': "bugs@company.xx", }, { 'realName': "Other Author", 'realEmail': "other@author.xx", 'name': "Some Garbage", 'email': "nick2@company.xx", }, { 'realName': "Phil Hill", 'realEmail': "phil@company.xx", 'name': "unknown", 'email': "phil@company.xx", }, { 'realName': "Joseph", 'realEmail': "joseph@company.xx", 'name': "Joseph", 'email': "bugs@company.xx", }, { 'realName': "Santa Claus", 'realEmail': "santa.claus@northpole.xx", 'name': "Clause", 'email': "me@company.xx", }, { 'realName': "Charles", 'realEmail': "charles@charles.xx", 'name': "Charles", 'email': "charles@charles.xx", }, ]; late Repository repo; late Directory tmpDir; setUp(() { tmpDir = setupRepo(Directory('test/assets/mailmaprepo/')); repo = Repository.open(tmpDir.path); }); tearDown(() { repo.free(); tmpDir.deleteSync(recursive: true); }); group('Mailmap', () { test('successfully initializes', () { final empty = Mailmap.empty(); expect(empty, isA()); empty.free(); }); test('successfully initializes from provided buffer', () { final mailmap = Mailmap.fromBuffer(testMailmap); expect(mailmap, isA()); for (final entry in testResolve) { expect( mailmap.resolve(name: entry['name']!, email: entry['email']!), [entry['realName'], entry['realEmail']], ); } mailmap.free(); }); test('successfully initializes from repository', () { final mailmap = Mailmap.fromRepository(repo); expect(mailmap, isA()); for (final entry in testResolve) { expect( mailmap.resolve(name: entry['name']!, email: entry['email']!), [entry['realName'], entry['realEmail']], ); } mailmap.free(); }); test('throws when initializing from repository and error occurs', () { expect( () => Mailmap.fromRepository(Repository(nullptr)), throwsA( isA().having( (e) => e.toString(), 'error', "invalid argument: 'repo'", ), ), ); }); test('successfully resolves names and emails when mailmap is empty', () { final mailmap = Mailmap.empty(); for (final entry in testResolve) { expect( mailmap.resolve(name: entry['name']!, email: entry['email']!), [entry['name'], entry['email']], ); } mailmap.free(); }); test('successfully adds entries and resolves them', () { final mailmap = Mailmap.empty(); for (final entry in testEntries) { mailmap.addEntry( realName: entry['realName'], realEmail: entry['realEmail'], replaceName: entry['name'], replaceEmail: entry['email']!, ); } for (final entry in testResolve) { expect( mailmap.resolve(name: entry['name']!, email: entry['email']!), [entry['realName'], entry['realEmail']], ); } mailmap.free(); }); test('throws when trying to add entry with empty replace email', () { final mailmap = Mailmap.empty(); expect( () => mailmap.addEntry( replaceEmail: ' ', ), throwsA( isA().having( (e) => e.toString(), 'error', 'Invalid argument: "replaceEmail can\'t be empty"', ), ), ); mailmap.free(); }); test('successfully resolves signature', () { final signature = Signature.create( name: 'nick1', email: 'bugs@company.xx', ); final realSignature = Signature.create( name: 'Some Dude', email: 'some@dude.xx', ); final mailmap = Mailmap.empty(); mailmap.addEntry( realName: 'Some Dude', realEmail: 'some@dude.xx', replaceName: 'nick1', replaceEmail: 'bugs@company.xx', ); expect(mailmap.resolveSignature(signature), realSignature); mailmap.free(); }); }); }