@@ -0,0 +1,74 @@
2+@testable import ParseableViewer
4+final class LogStreamTests: XCTestCase {
7+ func testSortsByNameAlphabetically() {
9+ LogStream(name: "zebra"),
10+ LogStream(name: "alpha"),
11+ LogStream(name: "middle"),
13+ let sorted = streams.sorted()
14+ XCTAssertEqual(sorted.map(\.name), ["alpha", "middle", "zebra"])
17+ func testSortIsCaseInsensitive() {
19+ LogStream(name: "Banana"),
20+ LogStream(name: "apple"),
21+ LogStream(name: "Cherry"),
23+ let sorted = streams.sorted()
24+ XCTAssertEqual(sorted.map(\.name), ["apple", "Banana", "Cherry"])
27+ func testSortWithNumericSuffixes() {
28+ // localizedStandardCompare sorts "stream2" before "stream10"
30+ LogStream(name: "stream10"),
31+ LogStream(name: "stream2"),
32+ LogStream(name: "stream1"),
34+ let sorted = streams.sorted()
35+ XCTAssertEqual(sorted.map(\.name), ["stream1", "stream2", "stream10"])
38+ func testSortStability() {
39+ // Two streams with the same name should preserve their relative order
40+ // (Swift's sorted() is stable since Swift 5)
41+ let a = LogStream(name: "same")
42+ let b = LogStream(name: "same")
43+ let sorted = [a, b].sorted()
44+ XCTAssertEqual(sorted.count, 2)
45+ XCTAssertEqual(sorted[0].name, "same")
46+ XCTAssertEqual(sorted[1].name, "same")
49+ func testSortEmptyArray() {
50+ let streams: [LogStream] = []
51+ let sorted = streams.sorted()
52+ XCTAssertTrue(sorted.isEmpty)
55+ func testSortSingleElement() {
56+ let streams = [LogStream(name: "only")]
57+ let sorted = streams.sorted()
58+ XCTAssertEqual(sorted.map(\.name), ["only"])
63+ func testDecodeFromObject() throws {
64+ let json = Data(#"{"name": "test-stream"}"#.utf8)
65+ let stream = try JSONDecoder().decode(LogStream.self, from: json)
66+ XCTAssertEqual(stream.name, "test-stream")
69+ func testDecodeFromString() throws {
70+ let json = Data(#""plain-string""#.utf8)
71+ let stream = try JSONDecoder().decode(LogStream.self, from: json)
72+ XCTAssertEqual(stream.name, "plain-string")