diff --git a/Sources/GRDBUndoRedo/UndoRedoManager.swift b/Sources/GRDBUndoRedo/UndoRedoManager.swift index 1ec5d82..94f2c17 100644 --- a/Sources/GRDBUndoRedo/UndoRedoManager.swift +++ b/Sources/GRDBUndoRedo/UndoRedoManager.swift @@ -214,4 +214,16 @@ extension UndoRedoManager { return _undoState.freeze >= 0 } } + + public var canUndo: Bool { + get { + return !_undoState.undoStack.isEmpty + } + } + + public var canRedo: Bool { + get { + return !_undoState.redoStack.isEmpty + } + } } diff --git a/Tests/GRDBUndoRedoTests/GRDBUndoRedoTests.swift b/Tests/GRDBUndoRedoTests/GRDBUndoRedoTests.swift index 83c25c1..1363325 100644 --- a/Tests/GRDBUndoRedoTests/GRDBUndoRedoTests.swift +++ b/Tests/GRDBUndoRedoTests/GRDBUndoRedoTests.swift @@ -80,6 +80,14 @@ final class UndoRedoManagerTests: XCTestCase { XCTAssertEqual(state, undoRedo._undoState) } + func testActiveGetterConsistency() throws { + undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) + + XCTAssertEqual(undoRedo.isActive, undoRedo._undoState.active) + try undoRedo.deactivate() + XCTAssertEqual(undoRedo.isActive, undoRedo._undoState.active) + } + func testFreeze() throws { undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) XCTAssertEqual(undoRedo._undoState.freeze, -1) @@ -235,6 +243,16 @@ final class UndoRedoManagerTests: XCTestCase { } } + func testCanUndoGetterConsistency() throws { + undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) + XCTAssertFalse(undoRedo.canUndo) + + let newItems = [Tbl1(a: 404)] + try insertDummies(newItems) + XCTAssertTrue(try undoRedo.barrier()) + XCTAssertTrue(undoRedo.canUndo) + } + func testUndoInsertOne() throws { undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) @@ -401,6 +419,21 @@ final class UndoRedoManagerTests: XCTestCase { } } + func testCanRedoGetterConsistency() throws { + undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) + XCTAssertFalse(undoRedo.canRedo) + + let newItems = [Tbl1(a: 404)] + try insertDummies(newItems) + XCTAssertTrue(try undoRedo.barrier()) + XCTAssertFalse(undoRedo.canRedo) + + try undoRedo.perform(.undo) + XCTAssertTrue(undoRedo.canRedo) + try undoRedo.perform(.redo) + XCTAssertFalse(undoRedo.canRedo) + } + func testRedoInsert() throws { undoRedo = try UndoRedoManager(recordTypes: Tbl1.self, db: dbQueue) let newItems = [Tbl1(a: 23)]