/ 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 }