75 lines
3.1 KiB
Dart
75 lines
3.1 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:friendly_map/modules/kinship/kinship.dart';
|
|
|
|
const M = Gender.male, F = Gender.female;
|
|
|
|
KinGraph family() {
|
|
final g = KinGraph();
|
|
for (final (id, gen, y) in [
|
|
('me', M, 1990), ('wife', F, 1991), ('son', M, 2020), ('daughter', F, 2022),
|
|
('dad', M, 1960), ('mom', F, 1962), ('gf', M, 1930), ('gm', F, 1932), ('mgf', M, 1935),
|
|
('uncle', M, 1958), ('sis', F, 1993), ('wifeDad', M, 1963), ('wifeMom', F, 1964),
|
|
]) {
|
|
g.put(KinPerson(id, gender: gen, birthYear: y));
|
|
}
|
|
g.addParent('me', 'dad');
|
|
g.addParent('me', 'mom');
|
|
g.addParent('sis', 'dad');
|
|
g.addParent('sis', 'mom');
|
|
g.addParent('dad', 'gf');
|
|
g.addParent('dad', 'gm');
|
|
g.addParent('uncle', 'gf');
|
|
g.addParent('mom', 'mgf');
|
|
g.addSpouse('dad', 'mom');
|
|
g.addSpouse('gf', 'gm');
|
|
g.addSpouse('me', 'wife');
|
|
g.addParent('son', 'me');
|
|
g.addParent('son', 'wife');
|
|
g.addParent('daughter', 'me');
|
|
g.addParent('wife', 'wifeDad');
|
|
g.addParent('wife', 'wifeMom');
|
|
g.addSpouse('wifeDad', 'wifeMom');
|
|
return g;
|
|
}
|
|
|
|
List<String> ids(TreeRow r) => [for (final c in r.cells) c.id];
|
|
|
|
void main() {
|
|
test('나 가운데: 위로 부모·조부모, 옆에 아내, 아래 자식', () {
|
|
final rows = familyTree(family(), 'me');
|
|
expect(rows.map((r) => r.gen), [-2, -1, 0, 1]);
|
|
final me = rows.firstWhere((r) => r.gen == 0);
|
|
expect(ids(me).indexOf('wife'), ids(me).indexOf('me') + 1, reason: '부부는 나란히');
|
|
expect(me.cells.firstWhere((c) => c.id == 'wife').spouseOf, 'me');
|
|
expect(ids(rows.firstWhere((r) => r.gen == 1)), ['son', 'daughter']);
|
|
});
|
|
|
|
test('친가는 왼쪽, 외가·처가는 오른쪽', () {
|
|
final rows = familyTree(family(), 'me');
|
|
final parents = ids(rows.firstWhere((r) => r.gen == -1));
|
|
expect(parents.indexOf('uncle'), lessThan(parents.indexOf('dad')), reason: '큰아버지(친가)가 왼쪽');
|
|
expect(parents.indexOf('wifeDad'), greaterThan(parents.indexOf('mom')), reason: '장인(처가)이 오른쪽');
|
|
expect(parents.indexOf('dad'), lessThan(parents.indexOf('mom')), reason: '부부는 남자가 왼쪽');
|
|
final gp = ids(rows.firstWhere((r) => r.gen == -2));
|
|
expect(gp.indexOf('gf'), lessThan(gp.indexOf('mgf')));
|
|
});
|
|
|
|
test('호칭은 기준 사람 눈으로: 아들을 기준으로 바꾸면 나는 아버지, 내 아버지는 할아버지', () {
|
|
final g = family();
|
|
final rows = familyTree(g, 'son');
|
|
TreeCell cell(String id) => rows.expand((r) => r.cells).firstWhere((c) => c.id == id);
|
|
expect(cell('son').isFocus, isTrue);
|
|
expect(cell('me').relation.title, '아버지');
|
|
expect(cell('dad').relation.title, contains('할아버지'));
|
|
expect(cell('daughter').relation.chon, 2);
|
|
expect(rows.first.gen, -3, reason: '아들 기준으로는 증조부모까지');
|
|
});
|
|
|
|
test('세대 범위 밖은 뺀다, 없는 사람은 빈 가계도', () {
|
|
expect(familyTree(family(), 'me', up: 1, down: 0).map((r) => r.gen), [-1, 0]);
|
|
expect(familyTree(family(), '없음'), isEmpty);
|
|
expect(const TreeRow(-1, []).label('나'), '부모 세대');
|
|
expect(const TreeRow(0, []).label('나'), '나');
|
|
});
|
|
}
|