blob: 9b779d61a4cb5468769c28088e0fe24112da31b3 [file] [log] [blame] [edit]
import 'package:equatable/equatable.dart';
import 'package:equatable/src/equatable_utils.dart';
import 'package:test/test.dart' hide equals;
class Person with EquatableMixin {
Person({required this.name});
final String name;
@override
List<Object?> get props => [name];
}
void main() {
final bob = Person(name: 'Bob');
final alice = Person(name: 'Alice');
final aliceCopy = Person(name: 'Alice');
group('equals', () {
test('returns true when both are null', () {
expect(equals(null, null), isTrue);
});
test('returns false when one is null', () {
expect(equals(null, []), isFalse);
expect(equals([], null), isFalse);
});
});
group('iterableEquals', () {
test('returns true for identical props', () {
final value = [Object()];
expect(iterableEquals(value, value), isTrue);
expect(equals(value, value), isTrue);
});
test('returns true for empty iterables', () {
expect(iterableEquals([], []), isTrue);
expect(equals([], []), isTrue);
});
test('returns false when props differ in length', () {
final object = Object();
expect(iterableEquals([object], [object, object]), isFalse);
expect(equals([object], [object, object]), isFalse);
});
test('uses == when props are equatable', () {
expect(iterableEquals([alice], [aliceCopy]), isTrue);
expect(iterableEquals([bob], [bob]), isTrue);
expect(iterableEquals([alice], [bob]), isFalse);
expect(iterableEquals([bob], [alice]), isFalse);
expect(iterableEquals([alice, null], [alice, -1]), isFalse);
expect(equals([alice], [aliceCopy]), isTrue);
expect(equals([bob], [bob]), isTrue);
expect(equals([alice], [bob]), isFalse);
expect(equals([bob], [alice]), isFalse);
expect(equals([alice, null], [alice, -1]), isFalse);
});
test('returns false for iterables with different elements', () {
final iterable1 = [1, 2, 3];
final iterable2 = [1, 2, 4];
expect(iterableEquals(iterable1, iterable2), isFalse);
expect(equals(iterable1, iterable2), isFalse);
});
test(
'returns false for iterable with same elements '
'but different order', () {
final iterable1 = [1, 2, 3];
final iterable2 = [1, 3, 2];
expect(iterableEquals(iterable1, iterable2), isFalse);
expect(equals(iterable1, iterable2), isFalse);
});
test('returns true for nested identical iterables', () {
final iterable1 = [
[bob, alice],
[alice, bob],
];
final iterable2 = [
[bob, alice],
[alice, bob],
];
expect(iterableEquals(iterable1, iterable2), isTrue);
expect(equals(iterable1, iterable2), isTrue);
});
test('returns false for nested iterables with different elements', () {
final iterable1 = [
[bob, 2],
[3, 4],
];
final iterable2 = [
[bob, 2],
[3, 5],
];
expect(iterableEquals(iterable1, iterable2), isFalse);
expect(equals(iterable1, iterable2), isFalse);
});
});
group('setEquals', () {
test('returns true for identical sets', () {
final set1 = {1, 2, 3};
final set2 = {1, 2, 3};
expect(setEquals(set1, set2), isTrue);
});
test('returns true for identical sets with elements in different order',
() {
final set1 = {1, 3, 2};
final set2 = {1, 2, 3};
expect(setEquals(set1, set2), isTrue);
});
test('returns false for sets of different lengths', () {
final set1 = {1, 2, 3};
final set2 = {1, 2};
expect(setEquals(set1, set2), isFalse);
});
test('returns false for sets with different elements', () {
final set1 = {1, 2, 3};
final set2 = {1, 2, 4};
expect(setEquals(set1, set2), isFalse);
});
test('uses == when props are equatable', () {
expect(setEquals({alice}, {aliceCopy}), isTrue);
expect(setEquals({bob}, {bob}), isTrue);
expect(setEquals({alice}, {bob}), isFalse);
expect(setEquals({bob}, {alice}), isFalse);
expect(setEquals({alice, null}, {alice, -1}), isFalse);
});
test('returns true for nested identical sets', () {
final set1 = {
{alice, bob},
{alice, bob},
};
final set2 = {
{alice, bob},
{alice, bob},
};
expect(setEquals(set1, set2), isTrue);
});
test('returns false for nested sets with different elements', () {
final set1 = {
{bob, 2},
{3, 4},
};
final set2 = {
{bob, 2},
{3, 5},
};
expect(setEquals(set1, set2), isFalse);
});
test('returns true for empty sets', () {
expect(setEquals({}, {}), isTrue);
});
test('returns false for sets with different types', () {
final set1 = {1, '2', 3};
final set2 = {1, 2, 3};
expect(setEquals(set1, set2), isFalse);
});
});
group('mapEquals', () {
test('returns true for identical maps', () {
final map1 = {'a': 1, 'b': 2, 'c': 3};
final map2 = {'a': 1, 'b': 2, 'c': 3};
expect(mapEquals(map1, map2), isTrue);
});
test(
'returns true for identical maps with elements in different order',
() {
final map1 = {'a': 1, 'c': 3, 'b': 2};
final map2 = {'a': 1, 'b': 2, 'c': 3};
expect(mapEquals(map1, map2), isTrue);
},
);
test('uses == when props are equatable', () {
expect(mapEquals({'a': alice}, {'a': aliceCopy}), isTrue);
expect(mapEquals({alice: 'a'}, {aliceCopy: 'a'}), isTrue);
expect(mapEquals({'a': bob}, {'a': bob}), isTrue);
});
test('returns false for maps of different lengths', () {
final map1 = {'a': 1, 'b': 2, 'c': 3};
final map2 = {'a': 1, 'b': 2};
expect(mapEquals(map1, map2), isFalse);
});
test('returns false for maps with different keys', () {
final map1 = {'a': 1, 'b': 2, 'c': 3};
final map2 = {'a': 1, 'b': 2, 'd': 3};
expect(mapEquals(map1, map2), isFalse);
});
test('returns false for maps with different values', () {
final map1 = {'a': 1, 'b': 2, 'c': 3};
final map2 = {'a': 1, 'b': 2, 'c': 4};
expect(mapEquals(map1, map2), isFalse);
});
test('returns true for nested identical maps', () {
final map1 = {
'a': {'x': 1, 'y': 2},
'b': {'z': 3},
};
final map2 = {
'a': {'x': 1, 'y': 2},
'b': {'z': 3},
};
expect(mapEquals(map1, map2), isTrue);
});
test('returns false for nested maps with different elements', () {
final map1 = {
'a': {'x': 1, 'y': 2},
'b': {'z': 3},
};
final map2 = {
'a': {'x': 1, 'y': 2},
'b': {'z': 4},
};
expect(mapEquals(map1, map2), isFalse);
});
test('returns true for empty maps', () {
expect(mapEquals({}, {}), isTrue);
});
test('returns false for maps with same keys but different values', () {
final map1 = {'a': 1, 'b': '2', 'c': 3};
final map2 = {'a': 1, 'b': 2, 'c': 3};
expect(mapEquals(map1, map2), isFalse);
});
test(
'returns false for maps with different keys '
'containing null values', () {
expect(mapEquals({'x': null}, {'y': 42}), isFalse);
expect(mapEquals({'x': null}, {'y': null}), isFalse);
expect(mapEquals({'a': 1, 'b': null}, {'a': 1, 'c': null}), isFalse);
});
});
group('objectsEquals', () {
test('returns true for identical objects', () {
final object = Object();
expect(objectsEquals(object, object), isTrue);
});
test('returns true for same objects', () {
const object1 = 'object';
// ignore: prefer_const_declarations
final object2 = 'object';
expect(objectsEquals(object1, object2), isTrue);
});
test('returns true for equatable objects', () {
expect(objectsEquals(alice, aliceCopy), isTrue);
expect(objectsEquals(bob, bob), isTrue);
});
test('returns false for different objects', () {
expect(objectsEquals(alice, bob), isFalse);
expect(objectsEquals(bob, alice), isFalse);
});
test('returns true for same lists', () {
expect(objectsEquals([1, 2, 3], [1, 2, 3]), isTrue);
});
test('returns true for same sets', () {
expect(objectsEquals({1, 2, 3}, {1, 2, 3}), isTrue);
expect(objectsEquals({1, 3, 2}, {1, 2, 3}), isTrue);
});
test('returns true for same maps', () {
expect(objectsEquals({'a': 1, 'b': 2}, {'a': 1, 'b': 2}), isTrue);
expect(objectsEquals({'c': 3, 'b': 2}, {'b': 2, 'c': 3}), isTrue);
});
test('returns false for different types', () {
expect(objectsEquals(1, '1'), isFalse);
});
test('returns true when two nums have the same value (int and double)', () {
const num a = 0;
const num b = 0.0;
expect(objectsEquals(a, b), isTrue);
});
test('returns true when two nums are identical', () {
const num a = 0;
expect(objectsEquals(a, a), isTrue);
});
test('returns false when two nums have different values', () {
const num a = 0;
const num b = 1;
expect(objectsEquals(a, b), isFalse);
});
});
}