@@ -25,7 +25,7 @@ final class FocusCommandTest: XCTestCase {
2525
2626 func testParse( ) {
2727 XCTAssertTrue ( parseCommand ( " focus --boundaries left " ) . errorOrNil? . contains ( " Possible values " ) == true )
28- var expected = FocusCmdArgs ( rawArgs: [ ] , direction : . left)
28+ var expected = FocusCmdArgs ( rawArgs: [ ] , cardinalOrDfsDirection : . direction ( . left) )
2929 expected. rawBoundaries = . workspace
3030 testParseCommandSucc ( " focus --boundaries workspace left " , expected)
3131
@@ -37,6 +37,10 @@ final class FocusCommandTest: XCTestCase {
3737 parseCommand ( " focus --window-id 42 --ignore-floating " ) . errorOrNil,
3838 " --window-id is incompatible with other options "
3939 )
40+ assertEquals (
41+ parseCommand ( " focus --boundaries all-monitors-outer-frame dfs-next " ) . errorOrNil,
42+ " (dfs-next|dfs-prev) only supports --boundaries workspace "
43+ )
4044 }
4145
4246 func testFocus( ) {
@@ -92,7 +96,7 @@ final class FocusCommandTest: XCTestCase {
9296 }
9397
9498 assertEquals ( focus. windowOrNil? . windowId, 1 )
95- var args = FocusCmdArgs ( rawArgs: [ ] , direction : . left)
99+ var args = FocusCmdArgs ( rawArgs: [ ] , cardinalOrDfsDirection : . direction ( . left) )
96100 args. rawBoundaries = . workspace
97101 args. rawBoundariesAction = . wrapAroundTheWorkspace
98102 FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin)
@@ -156,10 +160,79 @@ final class FocusCommandTest: XCTestCase {
156160 FocusCommand . new ( direction: . left) . run ( . defaultEnv, . emptyStdin)
157161 assertEquals ( focus. windowOrNil? . windowId, 1 )
158162 }
163+
164+ func testFocusDfsRelative( ) {
165+ Workspace . get ( byName: name) . rootTilingContainer. apply {
166+ TilingContainer . newVTiles ( parent: $0, adaptiveWeight: 1 ) . apply {
167+ assertEquals ( TestWindow . new ( id: 1 , parent: $0) . focusWindow ( ) , true )
168+ TilingContainer . newHTiles ( parent: $0, adaptiveWeight: 1 ) . apply {
169+ TestWindow . new ( id: 2 , parent: $0)
170+ TestWindow . new ( id: 3 , parent: $0)
171+ }
172+ }
173+ TestWindow . new ( id: 4 , parent: $0)
174+ }
175+
176+ assertEquals ( focus. windowOrNil? . windowId, 1 )
177+
178+ FocusCommand . new ( dfsRelative: . dfsNext) . run ( . defaultEnv, . emptyStdin)
179+ assertEquals ( focus. windowOrNil? . windowId, 2 )
180+ FocusCommand . new ( dfsRelative: . dfsNext) . run ( . defaultEnv, . emptyStdin)
181+ assertEquals ( focus. windowOrNil? . windowId, 3 )
182+ FocusCommand . new ( dfsRelative: . dfsNext) . run ( . defaultEnv, . emptyStdin)
183+ assertEquals ( focus. windowOrNil? . windowId, 4 )
184+
185+ FocusCommand . new ( dfsRelative: . dfsPrev) . run ( . defaultEnv, . emptyStdin)
186+ assertEquals ( focus. windowOrNil? . windowId, 3 )
187+ FocusCommand . new ( dfsRelative: . dfsPrev) . run ( . defaultEnv, . emptyStdin)
188+ assertEquals ( focus. windowOrNil? . windowId, 2 )
189+ FocusCommand . new ( dfsRelative: . dfsPrev) . run ( . defaultEnv, . emptyStdin)
190+ assertEquals ( focus. windowOrNil? . windowId, 1 )
191+ }
192+
193+ func testFocusDfsRelativeWrapping( ) {
194+ Workspace . get ( byName: name) . rootTilingContainer. apply {
195+ assertEquals ( TestWindow . new ( id: 1 , parent: $0) . focusWindow ( ) , true )
196+ TestWindow . new ( id: 2 , parent: $0)
197+ }
198+
199+ assertEquals ( focus. windowOrNil? . windowId, 1 )
200+
201+ var args = FocusCmdArgs ( rawArgs: [ ] , cardinalOrDfsDirection: . dfsRelative( . dfsPrev) )
202+
203+ args. rawBoundariesAction = . stop
204+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 0 )
205+ assertEquals ( focus. windowOrNil? . windowId, 1 )
206+
207+ args. rawBoundariesAction = . fail
208+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 1 )
209+ assertEquals ( focus. windowOrNil? . windowId, 1 )
210+
211+ args. rawBoundariesAction = . wrapAroundTheWorkspace
212+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 0 )
213+ assertEquals ( focus. windowOrNil? . windowId, 2 )
214+
215+ args. cardinalOrDfsDirection = . dfsRelative( . dfsNext)
216+
217+ args. rawBoundariesAction = . stop
218+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 0 )
219+ assertEquals ( focus. windowOrNil? . windowId, 2 )
220+
221+ args. rawBoundariesAction = . fail
222+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 1 )
223+ assertEquals ( focus. windowOrNil? . windowId, 2 )
224+
225+ args. rawBoundariesAction = . wrapAroundTheWorkspace
226+ assertEquals ( FocusCommand ( args: args) . run ( . defaultEnv, . emptyStdin) . exitCode, 0 )
227+ assertEquals ( focus. windowOrNil? . windowId, 1 )
228+ }
159229}
160230
161231extension FocusCommand {
162232 static func new( direction: CardinalDirection ) -> FocusCommand {
163- FocusCommand ( args: FocusCmdArgs ( rawArgs: [ ] , direction: direction) )
233+ FocusCommand ( args: FocusCmdArgs ( rawArgs: [ ] , cardinalOrDfsDirection: . direction( direction) ) )
234+ }
235+ static func new( dfsRelative: DfsNextPrev ) -> FocusCommand {
236+ FocusCommand ( args: FocusCmdArgs ( rawArgs: [ ] , cardinalOrDfsDirection: . dfsRelative( dfsRelative) ) )
164237 }
165238}
0 commit comments