summaryrefslogtreecommitdiff
path: root/internal/lsp/utf16_offset_test.go
blob: 49a0fa0b20ea08e603f22720795da20e59fe72d9 (plain)
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
package lsp

import "testing"

func TestUTF16OffsetToByteOffset_ASCII(t *testing.T) {
	s := "hello world"
	if got := utf16OffsetToByteOffset(s, 5); got != 5 {
		t.Fatalf("expected 5, got %d", got)
	}
}

func TestUTF16OffsetToByteOffset_MultiByte(t *testing.T) {
	// "aé" — 'a' is 1 byte/1 UTF-16 unit, 'é' is 2 bytes/1 UTF-16 unit
	s := "aé"
	// UTF-16 offset 1 → byte 1 (after 'a')
	if got := utf16OffsetToByteOffset(s, 1); got != 1 {
		t.Fatalf("expected 1 after 'a', got %d", got)
	}
	// UTF-16 offset 2 → byte 3 (after 'é' which is 2 UTF-8 bytes)
	if got := utf16OffsetToByteOffset(s, 2); got != 3 {
		t.Fatalf("expected 3 after 'é', got %d", got)
	}
}

func TestUTF16OffsetToByteOffset_Emoji(t *testing.T) {
	// "a🎉b" — 'a' is 1/1, '🎉' is 4 bytes / 2 UTF-16 units, 'b' is 1/1
	s := "a🎉b"
	// UTF-16 offset 1 → byte 1 (after 'a')
	if got := utf16OffsetToByteOffset(s, 1); got != 1 {
		t.Fatalf("expected 1, got %d", got)
	}
	// UTF-16 offset 3 → byte 5 (after '🎉' which is 4 bytes, 2 UTF-16 units)
	if got := utf16OffsetToByteOffset(s, 3); got != 5 {
		t.Fatalf("expected 5 after emoji, got %d", got)
	}
	// UTF-16 offset 4 → byte 6 (after 'b')
	if got := utf16OffsetToByteOffset(s, 4); got != 6 {
		t.Fatalf("expected 6, got %d", got)
	}
}

func TestUTF16OffsetToByteOffset_BeyondEnd(t *testing.T) {
	s := "abc"
	if got := utf16OffsetToByteOffset(s, 10); got != 3 {
		t.Fatalf("expected len(s)=3 for offset beyond end, got %d", got)
	}
}

func TestUTF16OffsetToByteOffset_Empty(t *testing.T) {
	if got := utf16OffsetToByteOffset("", 0); got != 0 {
		t.Fatalf("expected 0 for empty string, got %d", got)
	}
}

func TestUTF16OffsetToByteOffset_Zero(t *testing.T) {
	if got := utf16OffsetToByteOffset("hello", 0); got != 0 {
		t.Fatalf("expected 0 for offset 0, got %d", got)
	}
}