diff --git a/generator/test/generator_test.dart b/generator/test/generator_test.dart index 66b535954c..afdd33ed06 100644 --- a/generator/test/generator_test.dart +++ b/generator/test/generator_test.dart @@ -1,150 +1,27 @@ import 'package:build_test/build_test.dart'; import 'package:realm_generator/realm_generator.dart'; import 'package:test/test.dart'; +import 'test_util.dart'; void main() { - test('pinhole', () async { - await testBuilder( - generateRealmObjects(), - { - 'pkg|lib/src/test.dart': r''' -import 'package:realm_common/realm_common.dart'; - -part 'test.g.dart'; + final folderName = 'generator_test_io'; -@RealmModel() -class _Foo { - int x = 0; -}''', - }, - outputs: { - 'pkg|lib/src/test.realm_objects.g.part': '// **************************************************************************\n' - '// RealmObjectGenerator\n' - '// **************************************************************************\n' - '\n' - 'class Foo extends _Foo with RealmEntity, RealmObject {\n' - ' static var _defaultsSet = false;\n' - '\n' - ' Foo({\n' - ' int x = 0,\n' - ' }) {\n' - ' if (!_defaultsSet) {\n' - ' _defaultsSet = RealmObject.setDefaults({\n' - ' \'x\': 0,\n' - ' });\n' - ' }\n' - ' RealmObject.set(this, \'x\', x);\n' - ' }\n' - '\n' - ' Foo._();\n' - '\n' - ' @override\n' - ' int get x => RealmObject.get(this, \'x\') as int;\n' - ' @override\n' - ' set x(int value) => RealmObject.set(this, \'x\', value);\n' - '\n' - ' @override\n' - ' Stream> get changes =>\n' - ' RealmObject.getChanges(this);\n' - '\n' - ' static SchemaObject get schema => _schema ??= _initSchema();\n' - ' static SchemaObject? _schema;\n' - ' static SchemaObject _initSchema() {\n' - ' RealmObject.registerFactory(Foo._);\n' - ' return const SchemaObject(Foo, [\n' - ' SchemaProperty(\'x\', RealmPropertyType.int),\n' - ' ]);\n' - ' }\n' - '}\n' - '', - }, - reader: await PackageAssetReader.currentIsolate(), - ); + test('pinhole', () async { + await ioTestBuilder(folderName, 'pinhole.dart', 'pinhole.g.dart'); }); test('all types', () async { - await testBuilder( - generateRealmObjects(), - { - 'pkg|lib/src/test.dart': r''' -import 'dart:typed_data'; - -import 'package:realm_common/realm_common.dart'; - -part 'test.g.dart'; - -@RealmModel() -@MapTo('Fooo') -class _Foo { - int x = 0; -} - -@RealmModel() -class _Bar { - @PrimaryKey() - late String id; - late bool aBool, another; - var data = Uint8List(16); - // late RealmAny any; // not supported yet - @MapTo('tidspunkt') - var timestamp = DateTime.now(); - var aDouble = 0.0; - // late Decimal128 decimal; // not supported yet - _Foo? foo; - // late ObjectId id; - // late Uuid uuid; // not supported yet - @Ignored() - var theMeaningOfEverything = 42; - var list = [0]; // list of ints with default value - // late Set set; // not supported yet - // late map = {}; // not supported yet - - @Indexed() - String? anOptionalString; -}''' - }, - reader: await PackageAssetReader.currentIsolate(), - ); + await ioTestBuilder(folderName, 'all_types.dart'); }); test('not a realm type', () async { await expectLater( - () async => await testBuilder( - generateRealmObjects(), - { - 'pkg|lib/src/test.dart': r''' -import 'package:realm_common/realm_common.dart'; - -part 'test.g.dart'; - -class NonRealm {} - -@RealmModel() -class _Bad { - late NonRealm notARealmType; -}''' - }, - reader: await PackageAssetReader.currentIsolate(), - ), + () async => await ioTestErrorBuilder(folderName, 'not_a_realm_type.dart'), throwsA( isA().having( (e) => e.format(), 'format()', - 'Not a realm type\n' - '\n' - 'in: package:pkg/src/test.dart:9:8\n' - ' ╷\n' - '5 │ class NonRealm {}\n' - ' │ ━━━━━━━━ \n' - '... │\n' - '7 │ @RealmModel()\n' - '8 │ class _Bad {\n' - ' │ ━━━━ in realm model for \'Bad\'\n' - '9 │ late NonRealm notARealmType;\n' - ' │ ^^^^^^^^ NonRealm is not a realm model type\n' - ' ╵\n' - 'Add a @RealmModel annotation on \'NonRealm\', or an @Ignored annotation on \'notARealmType\'.\n' - '', + await readFileAsErrorFormattedString(folderName, 'not_a_realm_type.log'), ), ), ); @@ -971,7 +848,7 @@ class _Person { ); }); - test('map unsupported', () async { + test('map unsupported', () async { await expectLater( () async => await testBuilder( generateRealmObjects(), @@ -1006,5 +883,4 @@ class _Person { )), ); }); - } diff --git a/generator/test/generator_test_io/all_types.dart b/generator/test/generator_test_io/all_types.dart new file mode 100644 index 0000000000..1a5bbd01da --- /dev/null +++ b/generator/test/generator_test_io/all_types.dart @@ -0,0 +1,33 @@ +import 'dart:typed_data'; + +import 'package:realm_common/realm_common.dart'; + +@RealmModel() +@MapTo('Fooo') +class _Foo { + int x = 0; +} + +@RealmModel() +class _Bar { + @PrimaryKey() + late String id; + late bool aBool, another; + var data = Uint8List(16); + // late RealmAny any; // not supported yet + @MapTo('tidspunkt') + var timestamp = DateTime.now(); + var aDouble = 0.0; + // late Decimal128 decimal; // not supported yet + _Foo? foo; + // late ObjectId id; + // late Uuid uuid; // not supported yet + @Ignored() + var theMeaningOfEverything = 42; + var list = [0]; // list of ints with default value + // late Set set; // not supported yet + // late map = {}; // not supported yet + + @Indexed() + String? anOptionalString; +} diff --git a/generator/test/generator_test_io/not_a_realm_type.dart b/generator/test/generator_test_io/not_a_realm_type.dart new file mode 100644 index 0000000000..3d7e0ae285 --- /dev/null +++ b/generator/test/generator_test_io/not_a_realm_type.dart @@ -0,0 +1,10 @@ +import 'package:realm_common/realm_common.dart'; + +//part 'not_a_realm_type.g.dart'; + +class NonRealm {} + +@RealmModel() +class _Bad { + late NonRealm notARealmType; +} diff --git a/generator/test/generator_test_io/not_a_realm_type.log b/generator/test/generator_test_io/not_a_realm_type.log new file mode 100644 index 0000000000..e76e4c38b8 --- /dev/null +++ b/generator/test/generator_test_io/not_a_realm_type.log @@ -0,0 +1,15 @@ +Not a realm type + +in: asset:pkg/test/generator_test_io/not_a_realm_type.dart:9:8 + ╷ +5 │ class NonRealm {} + │ ━━━━━━━━ +... │ +7 │ @RealmModel() +8 │ class _Bad { + │ ━━━━ in realm model for 'Bad' +9 │ late NonRealm notARealmType; + │ ^^^^^^^^ NonRealm is not a realm model type + ╵ +Add a @RealmModel annotation on 'NonRealm', or an @Ignored annotation on 'notARealmType'. + diff --git a/generator/test/generator_test_io/pinhole.dart b/generator/test/generator_test_io/pinhole.dart new file mode 100644 index 0000000000..e723af9a7f --- /dev/null +++ b/generator/test/generator_test_io/pinhole.dart @@ -0,0 +1,9 @@ +import 'package:realm_common/realm_common.dart'; +import '../../../lib/realm.dart'; //For partial file references + +part 'pinhole.g.dart'; + +@RealmModel() +class _Foo { + int x = 0; +} diff --git a/generator/test/generator_test_io/pinhole.g.dart b/generator/test/generator_test_io/pinhole.g.dart new file mode 100644 index 0000000000..ef442bdbb3 --- /dev/null +++ b/generator/test/generator_test_io/pinhole.g.dart @@ -0,0 +1,38 @@ +// ************************************************************************** +// RealmObjectGenerator +// ************************************************************************** +part of 'pinhole.dart'; + +class Foo extends _Foo with RealmEntity, RealmObject { + static var _defaultsSet = false; + + Foo({ + int x = 0, + }) { + if (!_defaultsSet) { + _defaultsSet = RealmObject.setDefaults({ + 'x': 0, + }); + } + RealmObject.set(this, 'x', x); + } + + Foo._(); + + @override + int get x => RealmObject.get(this, 'x') as int; + @override + set x(int value) => RealmObject.set(this, 'x', value); + + @override + Stream> get changes => RealmObject.getChanges(this); + + static SchemaObject get schema => _schema ??= _initSchema(); + static SchemaObject? _schema; + static SchemaObject _initSchema() { + RealmObject.registerFactory(Foo._); + return const SchemaObject(Foo, [ + SchemaProperty('x', RealmPropertyType.int), + ]); + } +} diff --git a/generator/test/test_util.dart b/generator/test/test_util.dart new file mode 100644 index 0000000000..e9c8b7233f --- /dev/null +++ b/generator/test/test_util.dart @@ -0,0 +1,58 @@ +import 'dart:io'; +import 'dart:async'; +import 'dart:convert'; +import 'package:path/path.dart' as _path; +import 'package:dart_style/dart_style.dart'; +import 'package:build_test/build_test.dart'; +import 'package:realm_generator/realm_generator.dart'; + +String _stringReplacements(String content) { + final formatter = DartFormatter(); + var lines = LineSplitter.split(content); + String formattedContent = lines.where((element) => !element.startsWith("part of")).join('\n'); + return formatter.format(formattedContent); +} + +Future readFileAsDartFormattedString(String path) async { + var file = File(_path.join(Directory.current.path, path)); + String content = await file.readAsString(encoding: utf8); + return _stringReplacements(content); +} + +Future readFileAsErrorFormattedString(String directoryName, String logFileName) async { + var file = File(_path.join(Directory.current.path, 'test/$directoryName/$logFileName')); + String content = await file.readAsString(encoding: utf8); + if (Platform.isWindows) { + var macToWinSymbols = {'╷': ',', '━': '=', '╵': '\'', '│': '|'}; + macToWinSymbols.forEach((key, value) { + content = content.replaceAll(key, value); + }); + } + return LineSplitter.split(content).join('\n'); +} + +Future> getInputFileAsset(String inputFilePath) async { + var key = 'pkg|$inputFilePath'; + String inputContent = await readFileAsDartFormattedString(inputFilePath); + return {key: inputContent}; +} + +Future> getOutputFileAsset(String inputFilePath, String outputFilePath) async { + var key = 'pkg|${_path.setExtension(inputFilePath, '.realm_objects.g.part')}'; + String outputContent = await readFileAsDartFormattedString(outputFilePath); + return {key: outputContent}; +} + +Future ioTestBuilder(String directoryName, String inputFileName, [String outputFileName = ""]) async { + return testBuilder(generateRealmObjects(), await getInputFileAsset('test/$directoryName/$inputFileName'), + outputs: outputFileName.isEmpty ? null : await getOutputFileAsset('test/$directoryName/$inputFileName', 'test/$directoryName/$outputFileName'), + reader: await PackageAssetReader.currentIsolate()); +} + +Future ioTestErrorBuilder(String directoryName, String inputFileName) async { + return testBuilder( + generateRealmObjects(), + await getInputFileAsset('test/$directoryName/$inputFileName'), + reader: await PackageAssetReader.currentIsolate(), + ); +}