diff --git a/packages/cv/lib/cv.dart b/packages/cv/lib/cv.dart index a25dee8..e3b3988 100644 --- a/packages/cv/lib/cv.dart +++ b/packages/cv/lib/cv.dart @@ -46,3 +46,4 @@ export 'src/typedefs.dart' newModel, newModelList, CvBuilderFunction; +export 'src/utils.dart' show cvModelsAreEquals; diff --git a/packages/cv/lib/src/cv_field.dart b/packages/cv/lib/src/cv_field.dart index e7c1a95..fc8ece9 100644 --- a/packages/cv/lib/src/cv_field.dart +++ b/packages/cv/lib/src/cv_field.dart @@ -10,7 +10,7 @@ import 'field.dart'; /// If 2 values are equals, entering nested list/map if any. bool cvValuesAreEqual(dynamic v1, dynamic v2) { try { - return DeepCollectionEquality().equals(v1, v2); + return const DeepCollectionEquality().equals(v1, v2); } catch (_) { return v1 == v2; } diff --git a/packages/cv/lib/src/cv_model_mixin.dart b/packages/cv/lib/src/cv_model_mixin.dart index f402040..7d08e27 100644 --- a/packages/cv/lib/src/cv_model_mixin.dart +++ b/packages/cv/lib/src/cv_model_mixin.dart @@ -6,7 +6,6 @@ import 'builder.dart'; import 'cv_field.dart'; import 'env_utils.dart'; import 'field.dart'; -import 'utils.dart'; /// For dev only var debugContent = false; // devWarning(true); @@ -84,7 +83,7 @@ mixin CvModelMixin implements CvModel { @override bool operator ==(other) { if (other is CvModelRead) { - return cvModelAreEquals(this, other); + return cvModelsAreEquals(this, other); } return false; } diff --git a/packages/cv/lib/src/utils.dart b/packages/cv/lib/src/utils.dart index 7e9d4b9..d502c4b 100644 --- a/packages/cv/lib/src/utils.dart +++ b/packages/cv/lib/src/utils.dart @@ -10,15 +10,31 @@ bool isBasicTypeOrNull(dynamic value) { return false; } -/// If 2 content are equals -bool cvModelAreEquals(CvModelRead model1, CvModelRead model2) { - if (model1.fields.length != model2.fields.length) { - return false; - } - for (var cvField in model2.fields) { - if (model1.dynamicField(cvField.name) != cvField) { +/// If 2 models are equals +@Deprecated('Use cvModelsAreEquals') +bool cvModelAreEquals(CvModelRead model1, CvModelRead model2) => + cvModelsAreEquals(model1, model2); + +/// If 2 models are equals +bool cvModelsAreEquals(CvModelRead model1, CvModelRead model2, + {List? columns}) { + if (columns == null) { + if (model1.fields.length != model2.fields.length) { return false; } + for (var cvField in model2.fields) { + if (model1.dynamicField(cvField.name) != cvField) { + return false; + } + } + } else { + for (var column in columns) { + var field1 = model1.dynamicField(column); + var field2 = model2.dynamicField(column); + if (field1 != field2) { + return false; + } + } } return true; } diff --git a/packages/cv/test/cv_model_test.dart b/packages/cv/test/cv_model_test.dart index 4d8eb52..ec22a6d 100644 --- a/packages/cv/test/cv_model_test.dart +++ b/packages/cv/test/cv_model_test.dart @@ -26,6 +26,14 @@ class IntContent extends CvModelBase { List get fields => [value]; } +class TwoFieldsContent extends CvModelBase { + final value1 = CvField('value1'); + final value2 = CvField('value2'); + + @override + List get fields => [value1, value2]; +} + /// Builder IntContent intContentBuilder(Map map) => IntContent(); @@ -510,6 +518,27 @@ void main() { expect(model.test.v, '2'); expect(model.toMap(), {'dep': 'pre', 'test': 'pre,2'}); }); + test('cvModelAreEquals', () { + var content1 = TwoFieldsContent() + ..value1.v = 1 + ..value2.v = 2; + var content2 = TwoFieldsContent() + ..value1.v = 1 + ..value2.v = 2; + expect(cvModelsAreEquals(content1, content2), true); + content1.value1.v = 3; + expect(cvModelsAreEquals(content1, content2), false); + expect( + cvModelsAreEquals(content1, content2, columns: [content1.value1.key]), + false); + expect( + cvModelsAreEquals(content1, content2, columns: [content1.value2.key]), + true); + expect( + cvModelsAreEquals(content1, content2, + columns: [content1.value1.key, content1.value2.key]), + false); + }); }); }