Files
StickerSlack/StickerSlackTests/StickerSlackTests.swift
2025-10-31 15:06:53 +00:00

135 lines
4.0 KiB
Swift

//
// StickerSlackTests.swift
// StickerSlackTests
//
// Created by neon443 on 29/10/2025.
//
import Testing
import Foundation
struct ApiEmojiTests {
@Test func ApiEmojiEncode() async throws {
let apiEmoji = ApiEmoji(name: "name", url: "https://")
let encoded = try! JSONEncoder().encode(apiEmoji)
let decoded = try! JSONDecoder().decode(ApiEmoji.self, from: encoded)
#expect(decoded == apiEmoji)
}
@Test func ApiEmojiEncoder() async throws {
let json = "{\"name\":\"name\",\"urlString\":\"https:\\/\\/\"}"
let decoded = try! JSONDecoder().decode(ApiEmoji.self, from: json.data(using: .utf8)!)
let expected = ApiEmoji(name: "name", url: "https://")
#expect(expected == ApiEmoji(name: "name", url: "https://"))
}
@Test func ApiEmojiToEmoji() async throws {
let apiEmoji = ApiEmoji(name: "name", url: "https://")
let emoji = apiEmoji.toEmoji()
let expected = Emoji(apiEmoji: apiEmoji, id: emoji.id)
#expect(emoji == expected)
}
}
struct StickerSlackTests {
var hoarder = EmojiHoarder()
@Test func MSStickerValidation() async throws {
let goodEmoji = Emoji(apiEmoji: ApiEmoji(name: "name", url: "https://neon443.github.io/images/fav.ico"), id: UUID(uuidString: "0c48f4c3-1c63-41ed-96db-909e50e35dfc")!)
let _ = try! await goodEmoji.downloadImage()
#expect(goodEmoji.sticker!.validate(), "should be true")
let badEmoji = Emoji(apiEmoji: ApiEmoji(name: "160chars:shttps://emoji.slack-edge.com/T0266FRGM/100906/ddeb22d813b83b0f.pngs,sexpirationfds2025-10-28T08:00:02.011Zs},{gtypeh:jemojieeeidggg9cab2003-ad74-492a-", url: "https://files.catbox.moe/ifh710.png"), id: UUID(uuidString: "0c48f4c3-1c63-41ed-96db-909e50e35dfc")!)
let _ = try! await badEmoji.downloadImage()
#expect(goodEmoji.sticker!.validate(), "should be true")
badEmoji.deleteImage()
}
@Test func deleteAllEmojis() async throws {
await withDiscardingTaskGroup { group in
for emoji in hoarder.emojis {
group.addTask {
emoji.deleteImage()
}
}
}
}
}
struct PerformanceTests {
var hoarder = EmojiHoarder()
@Test func stickerConversion() async throws {
// Write your test here and use APIs like `#expect(...)` to check expected conditions.
for emoji in hoarder.emojis {
let _ = emoji.sticker
}
}
@Test func localImageURL() async throws {
for emoji in hoarder.emojis {
let _ = emoji.localImageURL
}
}
@Test func filteringEmojis() async throws {
let searchQueries = ["heavysob", "yay", "afsdjk", "afhjskf", "g4", "aqua-osx", "neotunes", "", "", ""]
for query in searchQueries {
print(query)
hoarder.filteredEmojis = []
hoarder.filterEmojis(by: query)
print(hoarder.filteredEmojis.count)
}
}
@Test func MSStickerValidation() async throws {
let downloadedEmojisBefore = hoarder.emojis.filter { $0.isLocal }.map { $0.id }
try? await withThrowingDiscardingTaskGroup { group in
var i = 0
let maxTasks = ProcessInfo.processInfo.processorCount-1
var activeTasks = 0
for emoji in hoarder.emojis {
if activeTasks >= maxTasks {
let ib4 = i
while i <= ib4 {
try? await Task.sleep(nanoseconds: 1)
}
activeTasks -= 1
}
group.addTask {
try? await doThing(on: emoji, i: &i)
activeTasks -= 1
}
activeTasks += 1
}
}
await withDiscardingTaskGroup { group in
var i = 0
for emoji in hoarder.emojis {
emoji.deleteImage()
guard downloadedEmojisBefore.contains(emoji.id) else { continue }
async let (data, _) = try! URLSession.shared.data(from: emoji.remoteImageURL)
try! await data.write(to: emoji.localImageURL)
i+=1
print("\(i)/\(downloadedEmojisBefore.count) \(emoji.name)")
}
}
}
func doThing(on emoji: Emoji, i: inout Int) async throws {
do {
guard !emoji.isLocal else { return }
async let (data, _) = try URLSession.shared.data(from: emoji.remoteImageURL)
try! await data.write(to: emoji.localImageURL)
let _ = emoji.sticker?.validate()
i+=1
print("\(i)/\(hoarder.emojis.count) \(emoji.name)")
} catch {
try! await doThing(on: emoji, i: &i)
}
}
}