import 'package:benchmark_harness/benchmark_harness.dart'; import 'package:benchmark_cherrypick/di_adapters/di_adapter.dart'; import 'package:benchmark_cherrypick/scenarios/universal_chain_module.dart'; import 'package:benchmark_cherrypick/scenarios/universal_service.dart'; class UniversalChainBenchmark extends BenchmarkBase { final DIAdapter _di; final int chainCount; final int nestingDepth; final UniversalBindingMode mode; final UniversalScenario scenario; DIAdapter? _childDi; UniversalChainBenchmark( this._di, { this.chainCount = 1, this.nestingDepth = 3, this.mode = UniversalBindingMode.singletonStrategy, this.scenario = UniversalScenario.chain, }) : super('Universal: $scenario/$mode CD=$chainCount/$nestingDepth'); @override void setup() { switch (scenario) { case UniversalScenario.override: _di.setupDependencies((scope) { scope.installModules([ UniversalChainModule( chainCount: chainCount, nestingDepth: nestingDepth, bindingMode: UniversalBindingMode.singletonStrategy, scenario: UniversalScenario.register, ), ]); }); _childDi = _di.openSubScope('child'); _childDi!.setupDependencies((scope) { scope.installModules([ UniversalChainModule( chainCount: chainCount, nestingDepth: nestingDepth, bindingMode: UniversalBindingMode.singletonStrategy, scenario: UniversalScenario.register, ), ]); }); break; default: _di.setupDependencies((scope) { scope.installModules([ UniversalChainModule( chainCount: chainCount, nestingDepth: nestingDepth, bindingMode: mode, scenario: scenario, ), ]); }); break; } } @override void teardown() => _di.teardown(); @override void run() { switch (scenario) { case UniversalScenario.register: _di.resolve(); break; case UniversalScenario.named: _di.resolve(named: 'impl2'); break; case UniversalScenario.chain: final serviceName = '${chainCount}_$nestingDepth'; _di.resolve(named: serviceName); break; case UniversalScenario.override: _childDi!.resolve(); break; case UniversalScenario.asyncChain: throw UnsupportedError('asyncChain supported only in UniversalChainAsyncBenchmark'); } } }