wasita
2026-03-04 59b58076016c5e5f09f16ab0395fed02e2ebb72e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import test, { describe } from "node:test"
import assert from "node:assert"
 
// Inline the encoder function from search.inline.ts for testing
const encoder = (str: string): string[] => {
  const tokens: string[] = []
  let bufferStart = -1
  let bufferEnd = -1
  const lower = str.toLowerCase()
 
  let i = 0
  for (const char of lower) {
    const code = char.codePointAt(0)!
 
    const isCJK =
      (code >= 0x3040 && code <= 0x309f) ||
      (code >= 0x30a0 && code <= 0x30ff) ||
      (code >= 0x4e00 && code <= 0x9fff) ||
      (code >= 0xac00 && code <= 0xd7af) ||
      (code >= 0x20000 && code <= 0x2a6df)
 
    const isWhitespace = code === 32 || code === 9 || code === 10 || code === 13
 
    if (isCJK) {
      if (bufferStart !== -1) {
        tokens.push(lower.slice(bufferStart, bufferEnd))
        bufferStart = -1
      }
      tokens.push(char)
    } else if (isWhitespace) {
      if (bufferStart !== -1) {
        tokens.push(lower.slice(bufferStart, bufferEnd))
        bufferStart = -1
      }
    } else {
      if (bufferStart === -1) bufferStart = i
      bufferEnd = i + char.length
    }
 
    i += char.length
  }
 
  if (bufferStart !== -1) {
    tokens.push(lower.slice(bufferStart))
  }
 
  return tokens
}
 
describe("search encoder", () => {
  describe("English text", () => {
    test("should tokenize simple English words", () => {
      const result = encoder("hello world")
      assert.deepStrictEqual(result, ["hello", "world"])
    })
 
    test("should handle multiple spaces", () => {
      const result = encoder("hello   world")
      assert.deepStrictEqual(result, ["hello", "world"])
    })
 
    test("should handle tabs and newlines", () => {
      const result = encoder("hello\tworld\ntest")
      assert.deepStrictEqual(result, ["hello", "world", "test"])
    })
 
    test("should lowercase all text", () => {
      const result = encoder("Hello WORLD Test")
      assert.deepStrictEqual(result, ["hello", "world", "test"])
    })
  })
 
  describe("CJK text", () => {
    test("should tokenize Japanese Hiragana character by character", () => {
      const result = encoder("こんにけは")
      assert.deepStrictEqual(result, ["こ", "γ‚“", "に", "け", "は"])
    })
 
    test("should tokenize Japanese Katakana character by character", () => {
      const result = encoder("γ‚³γƒ³γƒˆγƒ­γƒΌγƒ«")
      assert.deepStrictEqual(result, ["γ‚³", "ン", "γƒˆ", "γƒ­", "γƒΌ", "ル"])
    })
 
    test("should tokenize Japanese Kanji character by character", () => {
      const result = encoder("ζ—₯本θͺž")
      assert.deepStrictEqual(result, ["ζ—₯", "本", "θͺž"])
    })
 
    test("should tokenize Korean Hangul character by character", () => {
      const result = encoder("μ•ˆλ…•ν•˜μ„Έμš”")
      assert.deepStrictEqual(result, ["μ•ˆ", "λ…•", "ν•˜", "μ„Έ", "μš”"])
    })
 
    test("should tokenize Chinese characters character by character", () => {
      const result = encoder("δ½ ε₯½δΈ–η•Œ")
      assert.deepStrictEqual(result, ["δ½ ", "ε₯½", "δΈ–", "η•Œ"])
    })
 
    test("should handle mixed Hiragana/Katakana/Kanji", () => {
      const result = encoder("てδ»₯ζ₯")
      assert.deepStrictEqual(result, ["て", "δ»₯", "ζ₯"])
    })
  })
 
  describe("Mixed CJK and English", () => {
    test("should handle Japanese with English words", () => {
      const result = encoder("hello δΈ–η•Œ")
      assert.deepStrictEqual(result, ["hello", "δΈ–", "η•Œ"])
    })
 
    test("should handle English with Japanese words", () => {
      const result = encoder("δΈ–η•Œ hello world")
      assert.deepStrictEqual(result, ["δΈ–", "η•Œ", "hello", "world"])
    })
 
    test("should handle complex mixed content", () => {
      const result = encoder("γ“γ‚Œγ―test文章です")
      assert.deepStrictEqual(result, ["こ", "γ‚Œ", "は", "test", "ζ–‡", "η« ", "で", "す"])
    })
 
    test("should handle mixed Korean and English", () => {
      const result = encoder("hello μ•ˆλ…• world")
      assert.deepStrictEqual(result, ["hello", "μ•ˆ", "λ…•", "world"])
    })
 
    test("should handle mixed Chinese and English", () => {
      const result = encoder("δ½ ε₯½ world")
      assert.deepStrictEqual(result, ["δ½ ", "ε₯½", "world"])
    })
  })
 
  describe("Edge cases", () => {
    test("should handle empty string", () => {
      const result = encoder("")
      assert.deepStrictEqual(result, [])
    })
 
    test("should handle only whitespace", () => {
      const result = encoder("   \t\n  ")
      assert.deepStrictEqual(result, [])
    })
 
    test("should handle single character", () => {
      const result = encoder("a")
      assert.deepStrictEqual(result, ["a"])
    })
 
    test("should handle single CJK character", () => {
      const result = encoder("あ")
      assert.deepStrictEqual(result, ["あ"])
    })
 
    test("should handle CJK with trailing whitespace", () => {
      const result = encoder("ζ—₯本θͺž  ")
      assert.deepStrictEqual(result, ["ζ—₯", "本", "θͺž"])
    })
 
    test("should handle English with trailing whitespace", () => {
      const result = encoder("hello  ")
      assert.deepStrictEqual(result, ["hello"])
    })
  })
})