Verify behavior of the type-extracting builder

This commit is contained in:
Simon Binder 2019-11-18 15:02:31 +01:00
parent 8819245685
commit 261fbe6ba0
No known key found for this signature in database
GPG Key ID: 7891917E4147B8C0
2 changed files with 99 additions and 0 deletions

View File

@ -0,0 +1,59 @@
import 'dart:convert';
import 'package:build/build.dart';
import 'package:build_test/build_test.dart';
import 'package:moor_generator/src/backends/build/preprocess_builder.dart';
import 'package:test/test.dart';
import '../../test_utils.dart';
void main() {
test('writes types from expressions in moor files', () async {
final writer = InMemoryAssetWriter();
final reader = MultiAssetReader([
WrittenAssetsReader(writer),
await PackageAssetReader.currentIsolate(),
]);
await testBuilder(
PreprocessBuilder(),
{
'foo|main.moor': '''
import 'converter.dart';
--import 'package:moor_converters/converters.dart';
CREATE TABLE foo (
id INT NOT NULL MAPPED BY `const MyConverter()`
);
''',
'foo|converter.dart': '''
import 'package:moor/moor.dart';
class MyConverter extends TypeConverter<DateTime, int> {
const MyConverter();
int mapToSql(DateTime time) => time?.millisecondsSinceEpoch;
DateTime mapToDart(int fromSql) {
if (fromSql == null) return null;
return DateTime.fromMillisecondsSinceEpoch(fromSql);
}
}
''',
},
writer: writer,
reader: reader,
);
final output =
await reader.readAsString(AssetId.parse('foo|main.dart_in_moor'));
final serialized = json.decode(output);
expect(serialized['const MyConverter()'], {
'type': 'interface',
'library': 'asset:foo/converter.dart',
'class_name': 'MyConverter',
'type_args': [],
});
});
}

View File

@ -0,0 +1,40 @@
import 'dart:convert';
import 'package:build/build.dart';
import 'package:build_test/build_test.dart';
import 'package:glob/glob.dart';
/// A [MultiPackageAssetReader] able to read assets from a
/// [RecordingAssetWriter].
class WrittenAssetsReader extends MultiPackageAssetReader {
final RecordingAssetWriter source;
WrittenAssetsReader(this.source);
@override
Future<bool> canRead(AssetId id) {
return Future.value(source.assets.containsKey(id));
}
@override
Stream<AssetId> findAssets(Glob glob, {String package}) {
return Stream.fromIterable(source.assets.keys).where((id) {
final matchesPath = glob.matches(id.path);
if (package != null) {
return id.package == package && matchesPath;
}
return matchesPath;
});
}
@override
Future<List<int>> readAsBytes(AssetId id) {
return Future.value(source.assets[id]);
}
@override
Future<String> readAsString(AssetId id, {Encoding encoding}) {
final actualEncoding = encoding ?? utf8;
return Future.value(actualEncoding.decode(source.assets[id]));
}
}