github.com/lingyao2333/mo-zero@v1.4.1/core/stringx/trie_test.go (about)

     1  package stringx
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  )
     8  
     9  func TestTrieSimple(t *testing.T) {
    10  	trie := NewTrie([]string{
    11  		"bc",
    12  		"cd",
    13  	})
    14  	output, keywords, found := trie.Filter("abcd")
    15  	assert.True(t, found)
    16  	assert.Equal(t, "a***", output)
    17  	assert.ElementsMatch(t, []string{"bc", "cd"}, keywords)
    18  }
    19  
    20  func TestTrie(t *testing.T) {
    21  	tests := []struct {
    22  		input    string
    23  		output   string
    24  		keywords []string
    25  		found    bool
    26  	}{
    27  		{
    28  			input:  "日本AV演员兼电视、电影演员。无名氏AV女优是xx出道, 日本AV女优们最精彩的表演是AV演员色情表演",
    29  			output: "日本****兼电视、电影演员。*****女优是xx出道, ******们最精彩的表演是******表演",
    30  			keywords: []string{
    31  				"AV演员",
    32  				"无名氏",
    33  				"AV",
    34  				"日本AV女优",
    35  				"AV演员色情",
    36  			},
    37  			found: true,
    38  		},
    39  		{
    40  			input:    "完全和谐的文本完全和谐的文本",
    41  			output:   "完全和谐的文本完全和谐的文本",
    42  			keywords: nil,
    43  			found:    false,
    44  		},
    45  		{
    46  			input:  "就一个字不对",
    47  			output: "就*个字不对",
    48  			keywords: []string{
    49  				"一",
    50  			},
    51  			found: true,
    52  		},
    53  		{
    54  			input:  "就一对, AV",
    55  			output: "就*对, **",
    56  			keywords: []string{
    57  				"一",
    58  				"AV",
    59  			},
    60  			found: true,
    61  		},
    62  		{
    63  			input:  "就一不对, AV",
    64  			output: "就**对, **",
    65  			keywords: []string{
    66  				"一",
    67  				"一不",
    68  				"AV",
    69  			},
    70  			found: true,
    71  		},
    72  		{
    73  			input:  "就对, AV",
    74  			output: "就对, **",
    75  			keywords: []string{
    76  				"AV",
    77  			},
    78  			found: true,
    79  		},
    80  		{
    81  			input:  "就对, 一不",
    82  			output: "就对, **",
    83  			keywords: []string{
    84  				"一",
    85  				"一不",
    86  			},
    87  			found: true,
    88  		},
    89  		{
    90  			input:    "",
    91  			output:   "",
    92  			keywords: nil,
    93  			found:    false,
    94  		},
    95  	}
    96  
    97  	trie := NewTrie([]string{
    98  		"", // no hurts for empty keywords
    99  		"一",
   100  		"一不",
   101  		"AV",
   102  		"AV演员",
   103  		"无名氏",
   104  		"AV演员色情",
   105  		"日本AV女优",
   106  	})
   107  
   108  	for _, test := range tests {
   109  		t.Run(test.input, func(t *testing.T) {
   110  			output, keywords, ok := trie.Filter(test.input)
   111  			assert.Equal(t, test.found, ok)
   112  			assert.Equal(t, test.output, output)
   113  			assert.ElementsMatch(t, test.keywords, keywords)
   114  			keywords = trie.FindKeywords(test.input)
   115  			assert.ElementsMatch(t, test.keywords, keywords)
   116  		})
   117  	}
   118  }
   119  
   120  func TestTrieSingleWord(t *testing.T) {
   121  	trie := NewTrie([]string{
   122  		"闹",
   123  	}, WithMask('#'))
   124  	output, keywords, ok := trie.Filter("今晚真热闹")
   125  	assert.ElementsMatch(t, []string{"闹"}, keywords)
   126  	assert.True(t, ok)
   127  	assert.Equal(t, "今晚真热#", output)
   128  }
   129  
   130  func TestTrieOverlap(t *testing.T) {
   131  	trie := NewTrie([]string{
   132  		"一二三四五",
   133  		"二三四五六七八",
   134  	}, WithMask('#'))
   135  	output, keywords, ok := trie.Filter("零一二三四五六七八九十")
   136  	assert.ElementsMatch(t, []string{
   137  		"一二三四五",
   138  		"二三四五六七八",
   139  	}, keywords)
   140  	assert.True(t, ok)
   141  	assert.Equal(t, "零########九十", output)
   142  }
   143  
   144  func TestTrieNested(t *testing.T) {
   145  	trie := NewTrie([]string{
   146  		"一二三",
   147  		"一二三四五",
   148  		"一二三四五六七八",
   149  	}, WithMask('#'))
   150  	output, keywords, ok := trie.Filter("零一二三四五六七八九十")
   151  	assert.ElementsMatch(t, []string{
   152  		"一二三",
   153  		"一二三四五",
   154  		"一二三四五六七八",
   155  	}, keywords)
   156  	assert.True(t, ok)
   157  	assert.Equal(t, "零########九十", output)
   158  }