package mapping import ( "errors" "fmt" "testing" ) func TestDictTranslatesPHISToOSIAndOSIToPHIS(t *testing.T) { got, err := SexDict.PHISToOSI("1") if err != nil { t.Fatalf("PHISToOSI: %v", err) } if got != "1" { t.Fatalf("PHISToOSI = %q, want 1", got) } got, err = SexDict.OSIToPHIS("2") if err != nil { t.Fatalf("OSIToPHIS: %v", err) } if got != "2" { t.Fatalf("OSIToPHIS = %q, want 2", got) } } func TestDictReturnsValidationErrorForUnknownCode(t *testing.T) { _, err := SexDict.PHISToOSI("bad") if err == nil { t.Fatal("PHISToOSI accepted unknown code") } var validationErr ValidationError if !errors.As(err, &validationErr) { t.Fatalf("error type = %T, want ValidationError", err) } if validationErr.Field != "sexCode" || validationErr.Code != "bad" || validationErr.Direction != DirectionPHISToOSI { t.Fatalf("validation error = %#v", validationErr) } } func TestNationDictContains56EthnicGroupsAndOther(t *testing.T) { if got := NationDict.Len(); got != 57 { t.Fatalf("NationDict.Len = %d, want 57 including 99 other", got) } checks := map[string]string{ "01": "汉族", "02": "蒙古族", "10": "朝鲜族", "56": "基诺族", "99": "其他", } for code, wantName := range checks { entry, ok := NationDict.EntryByOSI(code) if !ok { t.Fatalf("NationDict missing code %s", code) } if entry.Name != wantName { t.Fatalf("NationDict[%s].Name = %q, want %q", code, entry.Name, wantName) } got, err := NationDict.PHISToOSI(code) if err != nil { t.Fatalf("Nation PHISToOSI(%s): %v", code, err) } if got != code { t.Fatalf("Nation PHISToOSI(%s) = %q", code, got) } } } func TestNationDictContainsAllCodesFrom01To56(t *testing.T) { for i := 1; i <= 56; i++ { code := fmt.Sprintf("%02d", i) if _, ok := NationDict.EntryByOSI(code); !ok { t.Fatalf("NationDict missing code %s", code) } } } func TestCoreDictsContainDocumentedValues(t *testing.T) { tests := []struct { name string dict Dict code string want string }{ {name: "blood", dict: BloodTypeDict, code: "4", want: "AB"}, {name: "rh", dict: RhBloodDict, code: "2", want: "阴性"}, {name: "education", dict: EducationDict, code: "31", want: "大专"}, {name: "work", dict: WorkDict, code: "Y", want: "其他"}, {name: "marital", dict: MaritalStatusDict, code: "40", want: "离婚"}, {name: "insurance", dict: InsuranceDict, code: "99", want: "其他"}, {name: "personSign", dict: PersonSignDict, code: "GRQY", want: "已签约"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { entry, ok := tt.dict.EntryByOSI(tt.code) if !ok { t.Fatalf("missing code %s", tt.code) } if entry.Name != tt.want { t.Fatalf("name = %q, want %q", entry.Name, tt.want) } }) } } func TestAllDictsRejectDuplicateCodes(t *testing.T) { for _, dict := range AllDicts() { if err := dict.Validate(); err != nil { t.Fatalf("%s Validate: %v", dict.Name, err) } } }