blob: a30207c5c0a5da2fba3f88812409a7fc3fd7c317 [file] [log] [blame]
// Copyright (c) 2019, 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.
/// Unit test for in-memory pipelines.
import 'dart:io';
import 'package:modular_test/src/io_pipeline.dart';
import 'pipeline_common.dart';
main() async {
var uri = Directory.systemTemp.uri.resolve("io_modular_test_root/");
int i = 0;
while (await Directory.fromUri(uri).exists()) {
uri = Directory.systemTemp.uri.resolve("io_modular_test_root$i/");
i++;
}
runPipelineTest(new IOPipelineTestStrategy(uri));
}
/// The strategy implementation to exercise the pipeline test on a
/// [IOPipeline].
class IOPipelineTestStrategy implements PipelineTestStrategy<IOModularStep> {
@override
final Uri testRootUri;
IOPipelineTestStrategy(this.testRootUri);
@override
Future<Pipeline<IOModularStep>> createPipeline(
Map<Uri, String> sources, List<IOModularStep> steps) async {
await Directory.fromUri(testRootUri).create();
for (var uri in sources.keys) {
var file = new File.fromUri(uri);
await file.create(recursive: true);
await file.writeAsStringSync(sources[uri]);
}
return new IOPipeline(steps, saveFoldersForTesting: true);
}
@override
IOModularStep createConcatStep({bool requestSources: true}) =>
ConcatStep(requestSources);
@override
IOModularStep createLowerCaseStep({bool requestModuleData: true}) =>
LowerCaseStep(requestModuleData);
@override
IOModularStep createReplaceAndJoinStep(
{bool requestDependenciesData: true}) =>
ReplaceAndJoinStep(requestDependenciesData);
@override
IOModularStep createReplaceAndJoinStep2(
{bool requestDependenciesData: true}) =>
ReplaceAndJoinStep2(requestDependenciesData);
@override
String getResult(covariant IOPipeline pipeline, Module m, DataId dataId) {
var folderUri = pipeline.tmpFoldersForTesting[dataId];
return File.fromUri(folderUri.resolve("${m.name}.${dataId.name}"))
.readAsStringSync();
}
@override
Future<void> cleanup(Pipeline<IOModularStep> pipeline) async {
var folders = (pipeline as IOPipeline).tmpFoldersForTesting.values;
for (var folder in folders) {
await Directory.fromUri(folder).delete(recursive: true);
}
await Directory.fromUri(testRootUri).delete(recursive: true);
}
}
class ConcatStep implements IOModularStep {
final bool needsSources;
List<DataId> get dependencyDataNeeded => const [];
List<DataId> get moduleDataNeeded => const [];
DataId get resultKind => const DataId("concat");
ConcatStep(this.needsSources);
@override
Future<void> execute(
Module module, Uri root, ModuleDataToRelativeUri toUri) async {
var buffer = new StringBuffer();
for (var uri in module.sources) {
var file = File.fromUri(root.resolveUri(uri));
String data = await file.exists() ? await file.readAsString() : null;
buffer.write("$uri: ${data}\n");
}
await File.fromUri(root.resolveUri(toUri(module, resultKind)))
.writeAsString('$buffer');
}
}
Future<String> _readHelper(Module module, Uri root, DataId dataId,
ModuleDataToRelativeUri toUri) async {
var file = File.fromUri(root.resolveUri(toUri(module, dataId)));
if (await file.exists()) {
return await file.readAsString();
}
return null;
}
class LowerCaseStep implements IOModularStep {
bool get needsSources => false;
List<DataId> get dependencyDataNeeded => const [];
final List<DataId> moduleDataNeeded;
DataId get resultKind => const DataId("lowercase");
LowerCaseStep(bool requestConcat)
: moduleDataNeeded = requestConcat ? const [DataId("concat")] : const [];
@override
Future<void> execute(
Module module, Uri root, ModuleDataToRelativeUri toUri) async {
var concatData =
await _readHelper(module, root, const DataId("concat"), toUri);
if (concatData == null) concatData = "data for $module was null";
await File.fromUri(root.resolveUri(toUri(module, resultKind)))
.writeAsString(concatData.toLowerCase());
}
}
class ReplaceAndJoinStep implements IOModularStep {
bool get needsSources => false;
final List<DataId> dependencyDataNeeded;
List<DataId> get moduleDataNeeded => const [DataId("lowercase")];
DataId get resultKind => const DataId("join");
ReplaceAndJoinStep(bool requestDependencies)
: dependencyDataNeeded =
requestDependencies ? const [DataId("join")] : [];
@override
Future<void> execute(
Module module, Uri root, ModuleDataToRelativeUri toUri) async {
var buffer = new StringBuffer();
for (var dependency in module.dependencies) {
var depData =
await _readHelper(dependency, root, const DataId("join"), toUri);
buffer.write("$depData\n");
}
var moduleData =
await _readHelper(module, root, const DataId("lowercase"), toUri);
buffer.write(moduleData.replaceAll(".dart:", ""));
await File.fromUri(root.resolveUri(toUri(module, resultKind)))
.writeAsString('$buffer');
}
}
class ReplaceAndJoinStep2 implements IOModularStep {
bool get needsSources => false;
final List<DataId> dependencyDataNeeded;
List<DataId> get moduleDataNeeded => const [DataId("lowercase")];
DataId get resultKind => const DataId("join");
ReplaceAndJoinStep2(bool requestDependencies)
: dependencyDataNeeded =
requestDependencies ? const [DataId("lowercase")] : [];
@override
Future<void> execute(
Module module, Uri root, ModuleDataToRelativeUri toUri) async {
var buffer = new StringBuffer();
for (var dependency in module.dependencies) {
var depData =
await _readHelper(dependency, root, const DataId("lowercase"), toUri);
buffer.write("$depData\n");
}
var moduleData =
await _readHelper(module, root, const DataId("lowercase"), toUri);
buffer.write(moduleData.replaceAll(".dart:", ""));
await File.fromUri(root.resolveUri(toUri(module, resultKind)))
.writeAsString('$buffer');
}
}