/ gomoji_test.go
gomoji_test.go
  1  package gomoji
  2  
  3  import (
  4  	"reflect"
  5  	"testing"
  6  )
  7  
  8  func TestContainsEmoji(t *testing.T) {
  9  	tests := []struct {
 10  		name     string
 11  		inputStr string
 12  		want     bool
 13  	}{
 14  		{
 15  			name:     "empty input string",
 16  			inputStr: "",
 17  			want:     false,
 18  		},
 19  		{
 20  			name:     "string without emoji",
 21  			inputStr: "hello! This is a simple string without any emoji",
 22  			want:     false,
 23  		},
 24  		{
 25  			name:     "numbers in string",
 26  			inputStr: "qwerty1",
 27  			want:     false,
 28  		},
 29  		{
 30  			name:     "emoji number in string",
 31  			inputStr: "qwerty1️⃣",
 32  			want:     true,
 33  		},
 34  		{
 35  			name:     "only emoji in string",
 36  			inputStr: `🥰`,
 37  			want:     true,
 38  		},
 39  		{
 40  			name:     "emoji in the middle of a string",
 41  			inputStr: `hi 😀 how r u?`,
 42  			want:     true,
 43  		},
 44  		{
 45  			name:     "emoji in the end of a string",
 46  			inputStr: `hi! how r u doing?🤔`,
 47  			want:     true,
 48  		},
 49  		{
 50  			name:     "heart emoji in string",
 51  			inputStr: "I ❤️ you",
 52  			want:     true,
 53  		},
 54  		{
 55  			name:     "it determines the skintone emojis",
 56  			inputStr: "I 👍🏿 you",
 57  			want:     true,
 58  		},
 59  		{
 60  			name:     "double exclamation mark in text",
 61  			inputStr: "Hello!!",
 62  			want:     false,
 63  		},
 64  		{
 65  			name:     "double exclamation mark emoji in text",
 66  			inputStr: "Hello‼",
 67  			want:     true,
 68  		},
 69  		{
 70  			name:     "emoji keycap # in text",
 71  			inputStr: "Just type #⃣",
 72  			want:     true,
 73  		},
 74  		{
 75  			name:     "text keycap # in text",
 76  			inputStr: "Just type #",
 77  			want:     false,
 78  		},
 79  	}
 80  	for _, tt := range tests {
 81  		t.Run(tt.name, func(t *testing.T) {
 82  			if got := ContainsEmoji(tt.inputStr); got != tt.want {
 83  				t.Errorf("ContainsEmoji() = %v, want %v", got, tt.want)
 84  			}
 85  		})
 86  	}
 87  }
 88  
 89  func BenchmarkContainsEmojiParallel(b *testing.B) {
 90  	b.RunParallel(func(pb *testing.PB) {
 91  		for pb.Next() {
 92  			ContainsEmoji("Hi \U0001F970")
 93  		}
 94  	})
 95  }
 96  
 97  func BenchmarkContainsEmoji(b *testing.B) {
 98  	for i := 0; i < b.N; i++ {
 99  		ContainsEmoji("Hi \U0001F970")
100  	}
101  }
102  
103  func TestRemoveEmojis(t *testing.T) {
104  	tests := []struct {
105  		name     string
106  		inputStr string
107  		want     string
108  	}{
109  		{
110  			name:     "string without emoji",
111  			inputStr: "string without emoji",
112  			want:     "string without emoji",
113  		},
114  		{
115  			name:     "string with numbers",
116  			inputStr: "1qwerty2",
117  			want:     "1qwerty2",
118  		},
119  		{
120  			name:     "string with emoji numbers",
121  			inputStr: "1️⃣qwerty2",
122  			want:     "qwerty2",
123  		},
124  		{
125  			name:     "string with emojis",
126  			inputStr: "❤️🛶😂",
127  			want:     "",
128  		},
129  		{
130  			name:     "string with unicode 14 emoji",
131  			inputStr: "te\U0001FAB7st",
132  			want:     "test",
133  		},
134  		{
135  			name:     "remove rare emojis",
136  			inputStr: "🧖 hello 🦋world",
137  			want:     "hello world",
138  		},
139  	}
140  	for _, tt := range tests {
141  		t.Run(tt.name, func(t *testing.T) {
142  			if got := RemoveEmojis(tt.inputStr); got != tt.want {
143  				t.Errorf("RemoveEmojis() = %v, want %v", got, tt.want)
144  			}
145  		})
146  	}
147  }
148  
149  func BenchmarkRemoveEmojisParallel(b *testing.B) {
150  	b.RunParallel(func(pb *testing.PB) {
151  		for pb.Next() {
152  			RemoveEmojis("\U0001F96F Hi \U0001F970")
153  		}
154  	})
155  }
156  
157  func BenchmarkRemoveEmojis(b *testing.B) {
158  	for i := 0; i < b.N; i++ {
159  		RemoveEmojis("\U0001F96F Hi \U0001F970")
160  	}
161  }
162  
163  func TestGetInfo(t *testing.T) {
164  	tests := []struct {
165  		name       string
166  		inputEmoji string
167  		want       Emoji
168  		wantErr    bool
169  	}{
170  		{
171  			name:       "just a number",
172  			inputEmoji: "1",
173  			want:       Emoji{},
174  			wantErr:    true,
175  		},
176  		{
177  			name:       "valid emoji number",
178  			inputEmoji: "1️⃣",
179  			want: Emoji{
180  				Slug:        "keycap-1",
181  				Character:   "1️⃣",
182  				UnicodeName: "E0.6 keycap: 1",
183  				CodePoint:   "0031 FE0F 20E3",
184  				Group:       "Symbols",
185  				SubGroup:    "keycap",
186  			},
187  			wantErr: false,
188  		},
189  		{
190  			name:       "unicode 14",
191  			inputEmoji: "\U0001FAAC",
192  			want: Emoji{
193  				Slug:        "hamsa",
194  				Character:   "🪬",
195  				UnicodeName: "E14.0 hamsa",
196  				CodePoint:   "1FAAC",
197  				Group:       "Activities",
198  				SubGroup:    "game",
199  			},
200  			wantErr: false,
201  		},
202  	}
203  	for _, tt := range tests {
204  		t.Run(tt.name, func(t *testing.T) {
205  			got, err := GetInfo(tt.inputEmoji)
206  			if (err != nil) != tt.wantErr {
207  				t.Errorf("GetInfo() error = %v, wantErr %v", err, tt.wantErr)
208  				return
209  			}
210  			if !reflect.DeepEqual(got, tt.want) {
211  				t.Errorf("GetInfo() got = %v, want %v", got, tt.want)
212  			}
213  		})
214  	}
215  }
216  
217  func BenchmarkGetInfoParallel(b *testing.B) {
218  	b.RunParallel(func(pb *testing.PB) {
219  		for pb.Next() {
220  			GetInfo("\U0001F96F") // nolint:errcheck
221  		}
222  	})
223  }
224  
225  func BenchmarkGetInfo(b *testing.B) {
226  	for i := 0; i < b.N; i++ {
227  		GetInfo("\U0001F96F") // nolint:errcheck
228  	}
229  }
230  
231  func TestFindAll(t *testing.T) {
232  	tests := []struct {
233  		name     string
234  		inputStr string
235  		want     []Emoji
236  	}{
237  		{
238  			name:     "empty string",
239  			inputStr: "",
240  			want:     nil,
241  		},
242  		{
243  			name:     "string without emoji",
244  			inputStr: "hello world",
245  			want:     nil,
246  		},
247  		{
248  			name:     "string with 2 emoji",
249  			inputStr: "hello 🦋 world \U0001F9FB",
250  			want: []Emoji{
251  				{
252  					Slug:        "butterfly",
253  					Character:   "🦋",
254  					UnicodeName: "E3.0 butterfly",
255  					CodePoint:   "1F98B",
256  					Group:       "Animals & Nature",
257  					SubGroup:    "animal-bug",
258  				},
259  				{
260  					Slug:        "roll-of-paper",
261  					Character:   "🧻",
262  					UnicodeName: "E11.0 roll of paper",
263  					CodePoint:   "1F9FB",
264  					Group:       "Objects",
265  					SubGroup:    "household",
266  				},
267  			},
268  		},
269  	}
270  	for _, tt := range tests {
271  		t.Run(tt.name, func(t *testing.T) {
272  			if got := FindAll(tt.inputStr); !reflect.DeepEqual(got, tt.want) {
273  				t.Errorf("FindAll() = %v, want %v", got, tt.want)
274  			}
275  		})
276  	}
277  }
278  
279  func BenchmarkFindAllParallel(b *testing.B) {
280  	b.RunParallel(func(pb *testing.PB) {
281  		for pb.Next() {
282  			FindAll("\U0001F96F Hi \U0001F970")
283  		}
284  	})
285  }
286  
287  func BenchmarkFindAll(b *testing.B) {
288  	for i := 0; i < b.N; i++ {
289  		FindAll("\U0001F96F Hi \U0001F970")
290  	}
291  }