Skip to content

Commit

Permalink
Merge branch 'Realm.RemoveMany' of https://github.com/realm/realm-dart
Browse files Browse the repository at this point in the history
…into Realm.RemoveMany
  • Loading branch information
desistefanova committed Jan 4, 2022
2 parents a6d02b0 + 47a217a commit 33b30f4
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 5 deletions.
6 changes: 5 additions & 1 deletion lib/src/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,11 @@ class RealmList<T extends Object> extends collection.ListBase<T> {

@override
void clear() {
throw UnimplementedError();
try {
realmCore.clear(this);
} catch (e) {
throw RealmException("Error clearing items from collection. Error: $e");
}
}
}

Expand Down
7 changes: 6 additions & 1 deletion lib/src/native/realm_core.dart
Original file line number Diff line number Diff line change
Expand Up @@ -384,14 +384,19 @@ class _RealmCore {
});
}

void realmListRemoveAll(RealmList list) {
void realmListRemoveAll(RealmList list) {
_realmLib.invokeGetBool(
() => _realmLib.realm_list_remove_all(list.handle._pointer));
}

void realmResultsRemoveAll(RealmResults results) {
_realmLib.invokeGetBool(() => _realmLib.realm_results_delete_all(results.handle._pointer));
}

void clear(RealmList list) {
_realmLib
.invokeGetBool(() => _realmLib.realm_list_clear(list.handle._pointer));
}
}

class LastError {
Expand Down
124 changes: 121 additions & 3 deletions test/realm_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -206,10 +206,10 @@ Future<void> main([List<String>? args]) async {

test('Realm is closed', () {
var config = Configuration([Car.schema]);
var realm = Realm(config);
var realm = Realm(config);
expect(realm.isClosed, false);

realm.close();
realm.close();
expect(realm.isClosed, true);
});

Expand Down Expand Up @@ -553,6 +553,123 @@ Future<void> main([List<String>? args]) async {
expect(() => realm.write(() => players[800] = Person()), throws<RealmException>());
});

test('RealmList clear items from list', () {
var config = Configuration([Team.schema, Person.schema]);
var realm = Realm(config);

//Create Team
final team = Team()..name = "Team";
realm.write(() => realm.add(team));

//Add players to Team

//Ensure Teams and players are in DB
var teamsFromDB = realm.all<Team>();
expect(teamsFromDB.length, 1);
final playersFromDB = teamsFromDB[0].players;
expect(playersFromDB, isNotNull);
expect(playersFromDB.length, 3);

//Clear Team.players list
realm.write(() => teamsFromDB[0].players.clear());

//Ensure that in DB Players are not reffered by the Team anymore
teamsFromDB = realm.all<Team>();
expect(teamsFromDB[0].players.length, 0);

//Ensure that in DB Players objects still exist detached from the Team
final allPlayersFromDB = realm.all<Person>();
expect(allPlayersFromDB.length, 3);
});

test('RealmList clear - same list related to two objects', () {
var config = Configuration([Team.schema, Person.schema]);
var realm = Realm(config);

//Createtwo Teams
final teamOne = Team()..name = "TeamOne";
final teamTwo = Team()..name = "TeamTwo";

//Ensure that Teams and Players exest in DB
var teamsFromDB = realm.all<Team>();
expect(teamsFromDB.length, 2);
expect(teamsFromDB[0].players, isNotNull);
expect(teamsFromDB[0].players.length, 3);
expect(teamsFromDB[1].players, isNotNull);
expect(teamsFromDB[1].players.length, 3);

//Clear Team1 players only
realm.write(() => teamsFromDB[0].players.clear());

//Ensure that Team2 is still related to players
teamsFromDB = realm.all<Team>();
expect(teamsFromDB[0].players.length, 0);
expect(teamsFromDB[1].players.length, 3);

//Ensure players still exist in DB
final allPlayersFromDB = realm.all<Person>();
expect(allPlayersFromDB.length, 3);
});

test('RealmList clear - same item added to two lists', () {
final teamOne = Team()..name = "TeamOne";
final teamTwo = Team()..name = "TeamTwo";
realm.write(() => {realm.add(teamOne), realm.add(teamTwo)});

//Add the same player to both Teams
Person player = Person()..name = "Michael Schumacher";
realm.write(() => {teamOne.players.add(player), teamTwo.players.add(player)});

//Ensure Teams and Player are in DB
var teamsFromDB = realm.all<Team>();
expect(teamsFromDB.length, 2);
expect(teamsFromDB[0].players, isNotNull);
expect(teamsFromDB[0].players.length, 1);
expect(teamsFromDB[1].players, isNotNull);
expect(teamsFromDB[1].players.length, 1);

//Clear player from Team1
realm.write(() => teamsFromDB[0].players.clear());

//Ensure that Team1 has no more players but Team2 is still related to the player
teamsFromDB = realm.all<Team>();
expect(teamsFromDB[0].players.length, 0);
expect(teamsFromDB[1].players.length, 1);

//Ensure the player still exists in DB
final allPlayersFromDB = realm.all<Person>();
expect(allPlayersFromDB.length, 1);
});

test('RealmList clear - exception', () {
var config = Configuration([Team.schema, Person.schema]);
var realm = Realm(config);

//Create Team
final team = Team()..name = "TeamOne";
realm.write(() => realm.add(team));

//Add the player to Team
Person player = Person()..name = "Michael Schumacher";
realm.write(() => team.players.add(player));

//Ensure Teams and Player are in DB
var teamsFromDB = realm.all<Team>();
expect(teamsFromDB.length, 1);
expect(teamsFromDB[0].players, isNotNull);
expect(teamsFromDB[0].players.length, 1);

var playersToDelete = teamsFromDB[0].players;
//Close realm before clear player from Team
expect(() => realm.write(() => {realm.close(), playersToDelete.clear()}),
throws<RealmException>("Error clearing items from collection"));

realm = Realm(config);
//Ensure that Team is still related to the player
teamsFromDB = realm.all<Team>();
expect(teamsFromDB.length, 1);
expect(teamsFromDB[0].players.length, 1);

test('Realm RemoveMany from List', () {
var config = Configuration([Team.schema, Person.schema]);
var realm = Realm(config);
Expand Down Expand Up @@ -616,6 +733,7 @@ Future<void> main([List<String>? args]) async {
//Create two Teams
final teamOne = Team()..name = "Ferrari";
final teamTwo = Team()..name = "Maserati";

realm.write(() => {realm.add(teamOne), realm.add(teamTwo)});

//Create common players list for both Teams
Expand All @@ -641,7 +759,7 @@ Future<void> main([List<String>? args]) async {
expect(personsFromDB.length, 0);
});

test('Realm RemoveMany from RealmResults', () {
test('Realm RemoveMany from RealmResults', () {
var config = Configuration([Team.schema, Person.schema]);
var realm = Realm(config);

Expand Down

0 comments on commit 33b30f4

Please sign in to comment.