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 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('나'), '나'); }); }