|
6 | 6 | "io" |
7 | 7 | "log" |
8 | 8 | "os" |
| 9 | + "os/exec" |
9 | 10 | "path/filepath" |
| 11 | + "strings" |
10 | 12 | "testing" |
11 | 13 | "time" |
12 | 14 |
|
@@ -359,30 +361,109 @@ func TestFindSytemFont(t *testing.T) { |
359 | 361 | tu.Assert(t, !ok) // user provided font are ignored |
360 | 362 | } |
361 | 363 |
|
362 | | -func TestResolve_ScriptBengali(t *testing.T) { |
| 364 | +// the following tests use a "linux" font configuration |
| 365 | +func newSampleFontmap() *FontMap { |
363 | 366 | fm := NewFontMap(log.New(io.Discard, "", 0)) |
364 | | - fm.appendFootprints(bengaliFontSet...) |
| 367 | + fm.appendFootprints(linuxSampleFontSet...) |
| 368 | + for _, fp := range linuxSampleFontSet { |
| 369 | + fm.cache(fp, &font.Face{Font: new(font.Font)}) // we need a new pointer for each file |
| 370 | + } |
| 371 | + return fm |
| 372 | +} |
| 373 | + |
| 374 | +func TestDumpSystemFonts(t *testing.T) { |
| 375 | + t.Skip() |
| 376 | + fontset, err := SystemFonts(nil, os.TempDir()) |
| 377 | + tu.AssertNoErr(t, err) |
| 378 | + |
| 379 | + var trimmed fontSet |
| 380 | + for _, fp := range fontset { |
| 381 | + switch fp.Family { |
| 382 | + case "nimbussans", "lohitbengali", "lohitdevanagari", "lohitodia", |
| 383 | + "notoloopedthai", "notosanskhmer", "khmeros", "khmerossystem", |
| 384 | + "freeserif", "freesans", "freemono", "dejavu", "dejavusans": |
| 385 | + trimmed = append(trimmed, fp) |
| 386 | + } |
| 387 | + } |
| 388 | + code := fmt.Sprintf(` |
| 389 | + package fontscan |
| 390 | + import "github.com/go-text/typesetting/font" |
| 391 | +
|
| 392 | + // extracted from a linux system |
| 393 | + var linuxSampleFontSet = |
| 394 | + %#v`, trimmed) |
| 395 | + code = strings.ReplaceAll(code, "fontscan.", "") |
| 396 | + code = strings.ReplaceAll(code, "Footprint{", "\n{") |
| 397 | + code = strings.ReplaceAll(code, ", Index:0x0, Instance:0x0", "") |
| 398 | + code = strings.ReplaceAll(code, ", isUserProvided:false", "") |
| 399 | + code = strings.ReplaceAll(code, "Location:", "\nLocation:") |
| 400 | + code = strings.ReplaceAll(code, "Runes:", "\nRunes:") |
| 401 | + code = strings.ReplaceAll(code, "Langs:", "\nLangs:") |
| 402 | + code = strings.ReplaceAll(code, "Aspect:", "\nAspect:") |
| 403 | + |
| 404 | + err = os.WriteFile("fontmap_sample_test.go", []byte(code), os.ModePerm) |
| 405 | + tu.AssertNoErr(t, err) |
| 406 | + |
| 407 | + err = exec.Command("goimports", "-w", "fontmap_sample_test.go").Run() |
| 408 | + tu.AssertNoErr(t, err) |
| 409 | +} |
| 410 | + |
| 411 | +func TestResolve_ScriptBengali(t *testing.T) { |
| 412 | + fm := newSampleFontmap() |
365 | 413 |
|
366 | 414 | // make sure the same font is selected for a given script, when possible |
367 | 415 | text := []rune("হয় না।") |
368 | 416 | fm.SetQuery(Query{Families: []string{"Nimbus Sans"}}) |
369 | 417 | runs := (&shaping.Segmenter{}).Split(shaping.Input{Text: text, RunEnd: len(text)}, fm) |
370 | 418 | tu.Assert(t, len(runs) == 1) |
371 | | - // only one font is loaded, so there is no Location.File collision |
372 | 419 | family, _ := fm.FontMetadata(runs[0].Face.Font) |
373 | 420 | tu.Assert(t, family == "lohitbengali") |
374 | 421 | } |
375 | 422 |
|
376 | 423 | func TestResolve_ScriptThaana(t *testing.T) { |
377 | | - fm := NewFontMap(log.New(io.Discard, "", 0)) |
378 | | - fm.appendFootprints(thaanaFontSet...) |
| 424 | + fm := newSampleFontmap() |
379 | 425 |
|
380 | 426 | // make sure the same font is selected for a given script, when possible |
381 | 427 | text := []rune("އުފަންވަނީ، ދަރަޖަ") |
382 | 428 | fm.SetQuery(Query{Families: []string{"Nimbus Sans"}}) |
383 | 429 | runs := (&shaping.Segmenter{}).Split(shaping.Input{Text: text, RunEnd: len(text)}, fm) |
384 | 430 | tu.Assert(t, len(runs) == 1) |
385 | | - // only one font is loaded, so there is no Location.File collision |
386 | 431 | family, _ := fm.FontMetadata(runs[0].Face.Font) |
387 | 432 | tu.Assert(t, family == "freeserif") |
| 433 | + tu.Assert(t, strings.HasSuffix(fm.FontLocation(runs[0].Face.Font).File, "FreeSerif.ttf")) |
| 434 | +} |
| 435 | + |
| 436 | +func TestResolve_SciptGujarati(t *testing.T) { |
| 437 | + fm := newSampleFontmap() |
| 438 | + |
| 439 | + text := []rune("ମୁଁ କାଚ ଖାଇପାରେ ଏବଂ ତାହା ମୋର କ୍ଷତି କରିନଥାଏ।") |
| 440 | + fm.SetQuery(Query{Families: []string{"Nimbus Sans"}}) |
| 441 | + runs := (&shaping.Segmenter{}).Split(shaping.Input{Text: text, RunEnd: len(text)}, fm) |
| 442 | + tu.Assert(t, len(runs) == 1) |
| 443 | + family, _ := fm.FontMetadata(runs[0].Face.Font) |
| 444 | + tu.Assert(t, family == "lohitodia") |
| 445 | +} |
| 446 | + |
| 447 | +func TestResolve_SciptArabic(t *testing.T) { |
| 448 | + fm := newSampleFontmap() |
| 449 | + |
| 450 | + text := []rune("میں کانچ کھا سکتا ہوں اور مجھے تکلیف نہیں ہوتی ۔") |
| 451 | + fm.SetQuery(Query{Families: []string{"Nimbus Sans"}}) |
| 452 | + runs := (&shaping.Segmenter{}).Split(shaping.Input{Text: text, RunEnd: len(text)}, fm) |
| 453 | + tu.Assert(t, len(runs) == 10) |
| 454 | + family0, _ := fm.FontMetadata(runs[0].Face.Font) |
| 455 | + family1, _ := fm.FontMetadata(runs[1].Face.Font) |
| 456 | + tu.Assert(t, family0 == "dejavusans") |
| 457 | + tu.Assert(t, family1 == "freeserif") |
| 458 | +} |
| 459 | + |
| 460 | +func TestResolve_SciptKhmer(t *testing.T) { |
| 461 | + fm := newSampleFontmap() |
| 462 | + |
| 463 | + text := []rune("ខ្ញុំអាចញុំកញ្ចក់បាន ដោយគ្មានបញ្ហារ") |
| 464 | + fm.SetQuery(Query{Families: []string{"Nimbus Sans"}}) |
| 465 | + runs := (&shaping.Segmenter{}).Split(shaping.Input{Text: text, RunEnd: len(text)}, fm) |
| 466 | + tu.Assert(t, len(runs) == 1) |
| 467 | + family, _ := fm.FontMetadata(runs[0].Face.Font) |
| 468 | + tu.Assert(t, family == "khmeros") |
388 | 469 | } |
0 commit comments