File: fmi_test.go

package info (click to toggle)
golang-github-shenwei356-bwt 0.6.0-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 100 kB
  • sloc: makefile: 2
file content (95 lines) | stat: -rw-r--r-- 2,154 bytes parent folder | download
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
package fmi

import (
	"testing"
)

type Case struct {
	s, q string
	m    int
	r    []int
}

var cases = []Case{
	{"mississippi", "iss", 0, []int{1, 4}},
	{"abcabcabc", "abc", 0, []int{0, 3, 6}},
	{"abcabcabc", "gef", 0, []int{}},
	{"abcabcabc", "gef", 0, []int{}},
	{"abcabcabc", "xef", 0, []int{}},
	{"abcabcabc", "xabcb", 1, []int{}},
	{"abcabcabc", "xabcb", 2, []int{2}},
	{"abcabd", "abc", 1, []int{0, 3}},

	{"acctatac", "ac", 0, []int{0, 6}},
	{"acctatac", "tac", 0, []int{5}},
	{"acctatac", "tac", 1, []int{3, 5}},
	{"acctatac", "taz", 1, []int{3, 5}},
	{"ccctatac", "tzc", 1, []int{5}},
	{"acctatac", "atac", 0, []int{4}},
	{"acctatac", "acctatac", 0, []int{0}},
	{"acctatac", "acctatac", 1, []int{0}},
	{"acctatac", "cctatac", 1, []int{1}},

	{"acctatac", "caa", 2, []int{1, 2, 3, 4, 5}},
	{"acctatac", "caa", 3, []int{0, 1, 2, 3, 4, 5}},
}

func TestLocate(t *testing.T) {
	var err error
	var match bool
	var fmi *FMIndex

	for i, c := range cases {
		fmi = NewFMIndex()
		_, err = fmi.Transform([]byte(c.s))
		if err != nil {
			t.Errorf("case #%d: Transform: %s", i+1, err)
			return
		}

		match, err = fmi.Match([]byte(c.q), c.m)
		if err != nil {
			t.Errorf("case #%d: Locate: %s", i, err)
			return
		}

		if match != (len(c.r) > 0) {
			t.Errorf("case #%d: Match '%s' in '%s' (allow %d mismatch), result: %v. right answer: %v", i+1, c.q, c.s, c.m, match, len(c.r) > 0)
			return
		}

	}
}

func TestMatch(t *testing.T) {
	var err error
	var loc []int
	var fmi *FMIndex

	for i, c := range cases {
		fmi = NewFMIndex()
		_, err = fmi.Transform([]byte(c.s))
		if err != nil {
			t.Errorf("case #%d: Transform: %s", i+1, err)
			return
		}

		loc, err = fmi.Locate([]byte(c.q), c.m)
		if err != nil {
			t.Errorf("case #%d: Locate: %s", i, err)
			return
		}

		if len(loc) != len(c.r) {
			t.Errorf("case #%d: Locate '%s' in '%s' (allow %d mismatch), result: %d. right answer: %d", i+1, c.q, c.s, c.m, loc, c.r)
			return
		}

		for j := 0; j < len(loc); j++ {
			if loc[j] != c.r[j] {
				t.Errorf("case #%d: Locate '%s' in '%s' (allow %d mismatch), result: %d. right answer: %d", i+1, c.q, c.s, c.m, loc, c.r)
				return
			}
		}
	}
}