mirror of
https://github.com/shadowsocks/ShadowsocksX-NG.git
synced 2026-11-08 10:44:50 +00:00
108 lines
4.7 KiB
Swift
108 lines
4.7 KiB
Swift
import Foundation
|
|
import Testing
|
|
|
|
@testable import ShadowsocksX_NG2
|
|
|
|
@MainActor
|
|
struct HomeTargetBrowserTests {
|
|
@Test
|
|
func firstEntryRevealsCurrentTargetOnlyOnceAndPersistsAncestors() throws {
|
|
let domain = UUID().uuidString
|
|
let defaults = UserDefaults(suiteName: domain)!
|
|
defer { defaults.removePersistentDomain(forName: domain) }
|
|
let fixture = try CatalogFixtures.makeSubscriptionFixture()
|
|
let tree = CatalogTreeSnapshot.build(
|
|
from: fixture.catalog, plugins: NoManagedPluginProvider())
|
|
let browser = HomeTargetBrowser(defaults: defaults)
|
|
#expect(browser.rows(in: tree, favorites: []).map(\.id) == [fixture.groupID])
|
|
|
|
#expect(
|
|
browser.enterHome(current: fixture.serverIDs[1], in: tree, favorites: [])
|
|
== fixture.serverIDs[1])
|
|
#expect(browser.selection == fixture.serverIDs[1])
|
|
#expect(
|
|
browser.rows(in: tree, favorites: []).map(\.id)
|
|
== [fixture.groupID, fixture.nestedGroupID, fixture.serverIDs[1], fixture.serverIDs[0]])
|
|
browser.select(fixture.groupID)
|
|
#expect(browser.enterHome(current: fixture.serverIDs[0], in: tree, favorites: []) == nil)
|
|
#expect(browser.selection == fixture.groupID)
|
|
|
|
let restored = HomeTargetBrowser(defaults: defaults)
|
|
#expect(restored.selection == nil)
|
|
#expect(restored.rows(in: tree, favorites: []).count == 4)
|
|
}
|
|
|
|
@Test
|
|
func collapsingAncestorSelectsGroupWithoutChangingOtherGroups() throws {
|
|
let domain = UUID().uuidString
|
|
let defaults = UserDefaults(suiteName: domain)!
|
|
defer { defaults.removePersistentDomain(forName: domain) }
|
|
let fixture = try CatalogFixtures.makeSubscriptionFixture()
|
|
let tree = CatalogTreeSnapshot.build(
|
|
from: fixture.catalog, plugins: NoManagedPluginProvider())
|
|
let browser = HomeTargetBrowser(defaults: defaults)
|
|
browser.enterHome(current: fixture.serverIDs[1], in: tree, favorites: [])
|
|
|
|
browser.toggleGroup(fixture.groupID, in: tree)
|
|
|
|
#expect(browser.selection == fixture.groupID)
|
|
#expect(browser.rows(in: tree, favorites: []).map(\.id) == [fixture.groupID])
|
|
#expect(browser.expandedGroupIDs == [fixture.nestedGroupID])
|
|
browser.toggleGroup(fixture.groupID, in: tree)
|
|
#expect(browser.selection == fixture.groupID)
|
|
#expect(browser.rows(in: tree, favorites: []).count == 4)
|
|
}
|
|
|
|
@Test
|
|
func favoritesAreFlatAndSwitchingClearsHiddenSelectionWhileLocateRestoresAll() throws {
|
|
let domain = UUID().uuidString
|
|
let defaults = UserDefaults(suiteName: domain)!
|
|
defer { defaults.removePersistentDomain(forName: domain) }
|
|
let fixture = try CatalogFixtures.makeSubscriptionFixture()
|
|
let tree = CatalogTreeSnapshot.build(
|
|
from: fixture.catalog, plugins: NoManagedPluginProvider())
|
|
let favorites = [fixture.groupID, fixture.serverIDs[0]].compactMap { tree.node(withID: $0) }
|
|
let browser = HomeTargetBrowser(defaults: defaults)
|
|
browser.enterHome(current: fixture.serverIDs[1], in: tree, favorites: favorites)
|
|
browser.setMode(.favorites, in: tree, favorites: favorites)
|
|
#expect(browser.selection == nil)
|
|
#expect(
|
|
browser.rows(in: tree, favorites: favorites).map(\.id)
|
|
== [fixture.groupID, fixture.serverIDs[0]])
|
|
#expect(browser.rows(in: tree, favorites: favorites).allSatisfy { $0.depth == 0 })
|
|
#expect(HomeTargetBrowser(defaults: defaults).mode == .favorites)
|
|
|
|
browser.locate(fixture.serverIDs[1], in: tree, favorites: favorites)
|
|
#expect(browser.mode == .all)
|
|
#expect(browser.selection == fixture.serverIDs[1])
|
|
#expect(HomeTargetBrowser(defaults: defaults).mode == .all)
|
|
browser.setMode(.favorites, in: tree, favorites: favorites)
|
|
browser.locate(fixture.groupID, in: tree, favorites: favorites)
|
|
#expect(browser.mode == .favorites)
|
|
#expect(browser.selection == fixture.groupID)
|
|
}
|
|
|
|
@Test
|
|
func catalogChangesPruneRemovedExpansionAndHiddenSelection() throws {
|
|
let domain = UUID().uuidString
|
|
let defaults = UserDefaults(suiteName: domain)!
|
|
defer { defaults.removePersistentDomain(forName: domain) }
|
|
let fixture = try CatalogFixtures.makeSubscriptionFixture()
|
|
let tree = CatalogTreeSnapshot.build(
|
|
from: fixture.catalog, plugins: NoManagedPluginProvider())
|
|
let browser = HomeTargetBrowser(defaults: defaults)
|
|
browser.enterHome(current: fixture.serverIDs[1], in: tree, favorites: [])
|
|
let reduced = CatalogTreeSnapshot(roots: [])
|
|
|
|
browser.reconcile(in: reduced, favorites: [])
|
|
|
|
#expect(browser.selection == nil)
|
|
#expect(browser.expandedGroupIDs.isEmpty)
|
|
#expect(HomeTargetBrowser(defaults: defaults).expandedGroupIDs.isEmpty)
|
|
browser.select(fixture.groupID)
|
|
browser.setMode(.favorites, in: tree, favorites: [tree.roots[0]])
|
|
browser.reconcile(in: tree, favorites: [])
|
|
#expect(browser.selection == nil)
|
|
}
|
|
}
|