1+ import { describe , expect , it } from 'vitest' ;
2+
3+ import {
4+ normalizeTransferredFontAssets ,
5+ serializeFontAssetsForTransfer ,
6+ } from '../src/shared/font-assets.js' ;
7+
8+ describe ( 'normalizeTransferredFontAssets' , ( ) => {
9+ it ( 'preserves existing Uint8Array sources' , ( ) => {
10+ const fontAssets = normalizeTransferredFontAssets ( {
11+ faces : [ {
12+ family : 'Font Awesome 6 Free' ,
13+ weight : '900' ,
14+ sources : [ {
15+ format : 'ttf' ,
16+ mimeType : 'font/ttf' ,
17+ data : new Uint8Array ( [ 1 , 2 , 3 ] ) ,
18+ } ] ,
19+ } ] ,
20+ } ) ;
21+
22+ expect ( fontAssets ?. faces ) . toHaveLength ( 1 ) ;
23+ expect ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ) . toBeInstanceOf ( Uint8Array ) ;
24+ expect ( Array . from ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ?? [ ] ) ) . toEqual ( [ 1 , 2 , 3 ] ) ;
25+ } ) ;
26+
27+ it ( 'rebuilds JSON-serialized typed arrays from numeric-key objects' , ( ) => {
28+ const fontAssets = normalizeTransferredFontAssets ( {
29+ faces : [ {
30+ family : 'Font Awesome 6 Brands' ,
31+ weight : '400' ,
32+ sources : [ {
33+ format : 'ttf' ,
34+ mimeType : 'font/ttf' ,
35+ data : { 0 : 9 , 1 : 10 , 2 : 255 } ,
36+ } ] ,
37+ } ] ,
38+ } ) ;
39+
40+ expect ( fontAssets ?. faces ) . toHaveLength ( 1 ) ;
41+ expect ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ) . toBeInstanceOf ( Uint8Array ) ;
42+ expect ( Array . from ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ?? [ ] ) ) . toEqual ( [ 9 , 10 , 255 ] ) ;
43+ } ) ;
44+
45+ it ( 'drops sources with unusable byte payloads' , ( ) => {
46+ const fontAssets = normalizeTransferredFontAssets ( {
47+ faces : [ {
48+ family : 'Broken Font' ,
49+ sources : [ {
50+ format : 'ttf' ,
51+ mimeType : 'font/ttf' ,
52+ data : null ,
53+ } ] ,
54+ } ] ,
55+ } ) ;
56+
57+ expect ( fontAssets ) . toBeUndefined ( ) ;
58+ } ) ;
59+
60+ it ( 'serializes Uint8Array sources into executeScript-safe arrays' , ( ) => {
61+ const fontAssets = serializeFontAssetsForTransfer ( {
62+ faces : [ {
63+ family : 'Font Awesome 6 Free' ,
64+ weight : '900' ,
65+ sources : [ {
66+ format : 'ttf' ,
67+ mimeType : 'font/ttf' ,
68+ data : new Uint8Array ( [ 1 , 2 , 3 ] ) ,
69+ } ] ,
70+ } ] ,
71+ } ) ;
72+
73+ expect ( fontAssets ?. faces ) . toHaveLength ( 1 ) ;
74+ expect ( Array . isArray ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ) ) . toBe ( true ) ;
75+ expect ( fontAssets ?. faces [ 0 ] . sources [ 0 ] . data ) . toEqual ( [ 1 , 2 , 3 ] ) ;
76+ } ) ;
77+
78+ it ( 'round-trips transfer serialization back to Uint8Array' , ( ) => {
79+ const transferred = serializeFontAssetsForTransfer ( {
80+ faces : [ {
81+ family : 'Font Awesome 6 Brands' ,
82+ weight : '400' ,
83+ sources : [ {
84+ format : 'ttf' ,
85+ mimeType : 'font/ttf' ,
86+ data : new Uint8Array ( [ 9 , 10 , 11 ] ) ,
87+ } ] ,
88+ } ] ,
89+ } ) ;
90+ const normalized = normalizeTransferredFontAssets ( transferred ) ;
91+
92+ expect ( normalized ?. faces ) . toHaveLength ( 1 ) ;
93+ expect ( normalized ?. faces [ 0 ] . sources [ 0 ] . data ) . toBeInstanceOf ( Uint8Array ) ;
94+ expect ( Array . from ( normalized ?. faces [ 0 ] . sources [ 0 ] . data ?? [ ] ) ) . toEqual ( [ 9 , 10 , 11 ] ) ;
95+ } ) ;
96+ } ) ;
0 commit comments