import 'package:flutter_test/flutter_test.dart'; import 'package:friendly_map/modules/core/core.dart'; import 'package:friendly_map/modules/visibility/visibility.dart'; void main() { final all = { CardKeys.name: '이미영', CardKeys.phone: '010-1234-5678', CardKeys.email: 'miyoung@mail.com', CardKeys.birthday: '03-14', CardKeys.company: '한빛소프트', CardKeys.position: '팀장', CardKeys.school: '한국대', CardKeys.year: '2008', }; group('표', () { test('처음 값: 가족은 모두 공개, 그룹은 숨김', () { final m = VisibilityMatrix.defaults(); for (final c in VCategory.all) { expect(m.get(c, VAudience.family), VLevel.open); } expect(m.get(VCategory.birthday, VAudience.group), VLevel.hidden); expect(m.get(VCategory.work, VAudience.school), VLevel.partial); }); test('칸을 바꾸고 글자로 저장했다가 복원, 깨진 글자는 처음 값', () { final m = VisibilityMatrix.defaults().with_(VCategory.birthday, VAudience.group, VLevel.open); final back = VisibilityMatrix.fromJson(m.toJson()); expect(back.get(VCategory.birthday, VAudience.group), VLevel.open); expect(back.get(VCategory.school, VAudience.family), VLevel.open); expect(VisibilityMatrix.fromJson('{깨짐').get(VCategory.birthday, VAudience.group), VLevel.hidden); expect(VisibilityMatrix.fromJson(null).get(VCategory.contact, VAudience.company), VLevel.partial); }); test('단계는 공개→일부→숨김→공개로 돈다', () { expect(VLevel.open.next, VLevel.partial); expect(VLevel.partial.next, VLevel.hidden); expect(VLevel.hidden.next, VLevel.open); }); test('여러 관계면 가장 많이 보여 주는 단계', () { final m = VisibilityMatrix.defaults(); expect(m.forAudiences(VCategory.birthday, [VAudience.group, VAudience.company]), VLevel.partial); expect(m.forAudiences(VCategory.birthday, [VAudience.group, VAudience.family]), VLevel.open); }); }); group('관계 찾기', () { test('연결 관계 글자와 명함 종류에서 관계 묶음', () { expect(VAudience.ofRelation('가족:어머니'), VAudience.family); expect(VAudience.ofRelation('전 직장 동료'), VAudience.company); expect(VAudience.ofRelation('동창'), VAudience.school); expect(VAudience.ofRelation('같은 여행'), VAudience.group); expect(VAudience.ofRelation('이웃'), null); expect(VAudience.ofCardKind(CardKinds.company), VAudience.company); expect(VAudience.ofCardKind(CardKinds.personal), null); }); }); group('걸러 내기', () { final m = VisibilityMatrix.defaults(); test('관계를 모르는 사람에게는 내가 고른 그대로', () { expect(applyVisibility(all, {}, m), all); }); test('가족에게는 전부', () { expect(applyVisibility(all, {VAudience.family}, m), all); }); test('그룹 사람에게는 이름만 남고 나머지는 숨김', () { final out = applyVisibility(all, {VAudience.group}, m); expect(out, {CardKeys.name: '이미영'}); }); test('회사 사람: 연락처·생일은 일부, 학교·회사는 공개', () { final out = applyVisibility(all, {VAudience.company}, m); expect(out[CardKeys.phone], '****5678'); expect(out[CardKeys.email], 'm***@mail.com'); expect(out[CardKeys.birthday], '3월'); expect(out[CardKeys.company], '한빛소프트'); expect(out[CardKeys.position], '팀장'); expect(out[CardKeys.school], '한국대'); }); test('동문 사람: 회사는 이름만(직책 빠짐), 생일·연락처 숨김', () { final out = applyVisibility(all, {VAudience.school}, m); expect(out[CardKeys.company], '한빛소프트'); expect(out.containsKey(CardKeys.position), false); expect(out.containsKey(CardKeys.birthday), false); expect(out.containsKey(CardKeys.phone), false); expect(out[CardKeys.school], '한국대'); }); test('원본은 바뀌지 않는다', () { applyVisibility(all, {VAudience.group}, m); expect(all.length, 8); }); }); }