| // Copyright (c) 2025, 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. | |
| import 'dart:io'; | |
| import 'package:jnigen/jnigen.dart'; | |
| import 'package:jnigen/src/logging/logging.dart'; | |
| import 'package:jnigen/src/summary/summary.dart'; | |
| import 'package:path/path.dart'; | |
| import 'package:test/test.dart'; | |
| void expectBuildSummarizerTriggered(List<String> log, {bool triggered = true}) { | |
| final matcher = contains(predicate<String>( | |
| (msg) => | |
| msg.contains('ApiSummarizer.jar exists') || | |
| msg.contains('Building ApiSummarizer component') || | |
| msg.contains('Rebuilding ApiSummarizer component'), | |
| )); | |
| expect(log, triggered ? matcher : isNot(matcher)); | |
| } | |
| void main() { | |
| test('Warn if non-jnigen-generated files exist in directory', () async { | |
| final root = await Directory.current.createTemp(); | |
| final nonGenerated = | |
| await File.fromUri(root.uri.resolve('non_gen.dart')).create(); | |
| await nonGenerated.writeAsString('void main() {}'); | |
| final generated = await File.fromUri(root.uri.resolve('gen.dart')).create(); | |
| await generated | |
| .writeAsString('// AUTO GENERATED BY JNIGEN 1.2.3. DO NOT EDIT!\n'); | |
| final sourcePath = | |
| join(Directory.current.path, 'test', 'simple_package_test', 'java'); | |
| print(sourcePath); | |
| final logMessages = <String>[]; | |
| final logSub = log.onRecord.listen((r) => logMessages.add(r.message)); | |
| await expectLater( | |
| () => JniGenerator( | |
| input: Input( | |
| classes: ['com.github.dart_lang.jnigen.simple_package'], | |
| sourcePath: [Uri.directory(sourcePath)], | |
| ), | |
| output: Output( | |
| dart: DartOutput( | |
| path: root.uri, | |
| structure: OutputStructure.packageStructure, | |
| ), | |
| ), | |
| ).generate(), | |
| throwsA(allOf([ | |
| isA<StateError>(), | |
| predicate( | |
| (error) => error.toString().contains('not generated by JNIgen')), | |
| predicate((error) => error.toString().contains('non_gen.dart')), | |
| ])), | |
| ); | |
| await logSub.cancel(); | |
| expectBuildSummarizerTriggered(logMessages, triggered: true); | |
| await root.delete(recursive: true); | |
| }); | |
| test('buildSummarizerIfNotExists is skipped if summarizerCommand is passed', | |
| () async { | |
| final root = await Directory.current.createTemp(); | |
| final fakeSummarizer = File(join(root.path, 'fake_summarizer.dart')); | |
| const errorMessage = 'Custom summarizer error output'; | |
| await fakeSummarizer.writeAsString(''' | |
| import 'dart:io'; | |
| void main() { | |
| stderr.writeln('$errorMessage'); | |
| exit(1); | |
| } | |
| '''); | |
| final outDir = Directory(join(root.path, 'out'))..createSync(); | |
| final config = JniGenerator( | |
| input: Input( | |
| classes: ['com.example.Test'], | |
| summarizerCommand: '${Platform.executable} ${fakeSummarizer.path}', | |
| ), | |
| output: Output( | |
| dart: DartOutput( | |
| path: outDir.uri, | |
| structure: OutputStructure.packageStructure, | |
| ), | |
| ), | |
| ); | |
| final logMessages = <String>[]; | |
| final logSub = log.onRecord.listen((r) => logMessages.add(r.message)); | |
| try { | |
| await getSummary(config); | |
| fail('Expected SummaryParseException'); | |
| } on SummaryParseException catch (e) { | |
| expect(e.stderr, contains(errorMessage)); | |
| } | |
| await logSub.cancel(); | |
| expectBuildSummarizerTriggered(logMessages, triggered: false); | |
| expect( | |
| logMessages, | |
| contains(predicate<String>( | |
| (msg) => msg.contains('execute ${Platform.executable}'))), | |
| ); | |
| await root.delete(recursive: true); | |
| }); | |
| } |