|  |  |  | // | 
					
						
							|  |  |  | //  Copyright (c) 2019 Open Whisper Systems. All rights reserved. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import XCTest | 
					
						
							|  |  |  | @testable import Session | 
					
						
							|  |  |  | @testable import SignalMessaging | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extension ImageEditorModel { | 
					
						
							|  |  |  |     func itemIds() -> [String] { | 
					
						
							|  |  |  |         return items().map { (item) in | 
					
						
							|  |  |  |             item.itemId | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ImageEditorTest: SignalBaseTest { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func setUp() { | 
					
						
							|  |  |  |         super.setUp() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     override func tearDown() { | 
					
						
							|  |  |  |         // Put teardown code here. This method is called after the invocation of each test method in the class. | 
					
						
							|  |  |  |         super.tearDown() | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testImageEditorContents() { | 
					
						
							|  |  |  |         let contents = ImageEditorContents() | 
					
						
							|  |  |  |         XCTAssertEqual(0, contents.itemMap.count) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let item = ImageEditorItem(itemType: .test) | 
					
						
							|  |  |  |         contents.append(item: item) | 
					
						
							|  |  |  |         XCTAssertEqual(1, contents.itemMap.count) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let contentsCopy = contents.clone() | 
					
						
							|  |  |  |         XCTAssertEqual(1, contents.itemMap.count) | 
					
						
							|  |  |  |         XCTAssertEqual(1, contentsCopy.itemMap.count) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         contentsCopy.remove(item: item) | 
					
						
							|  |  |  |         XCTAssertEqual(1, contents.itemMap.count) | 
					
						
							|  |  |  |         XCTAssertEqual(0, contentsCopy.itemMap.count) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let modifiedItem = ImageEditorItem(itemId: item.itemId, itemType: item.itemType) | 
					
						
							|  |  |  |         contents.replace(item: modifiedItem) | 
					
						
							|  |  |  |         XCTAssertEqual(1, contents.itemMap.count) | 
					
						
							|  |  |  |         XCTAssertEqual(0, contentsCopy.itemMap.count) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private func writeDummyImage() -> String { | 
					
						
							|  |  |  |         let image = UIImage.init(color: .red, size: CGSize(width: 1, height: 1)) | 
					
						
							|  |  |  |         guard let data = image.pngData() else { | 
					
						
							|  |  |  |             owsFail("Couldn't export dummy image.") | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         let filePath = OWSFileSystem.temporaryFilePath(withFileExtension: "png") | 
					
						
							|  |  |  |         try! data.write(to: URL(fileURLWithPath: filePath)) | 
					
						
							|  |  |  |         return filePath | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     func testImageEditor() { | 
					
						
							|  |  |  |         let imagePath = writeDummyImage() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let imageEditor = try! ImageEditorModel(srcImagePath: imagePath) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(0, imageEditor.itemCount()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let itemA = ImageEditorItem(itemType: .test) | 
					
						
							|  |  |  |         imageEditor.append(item: itemA) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(1, imageEditor.itemCount()) | 
					
						
							|  |  |  |         XCTAssertEqual([itemA.itemId], imageEditor.itemIds()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         imageEditor.undo() | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(0, imageEditor.itemCount()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         imageEditor.redo() | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(1, imageEditor.itemCount()) | 
					
						
							|  |  |  |         XCTAssertEqual([itemA.itemId], imageEditor.itemIds()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         imageEditor.undo() | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(0, imageEditor.itemCount()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let itemB = ImageEditorItem(itemType: .test) | 
					
						
							|  |  |  |         imageEditor.append(item: itemB) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(1, imageEditor.itemCount()) | 
					
						
							|  |  |  |         XCTAssertEqual([itemB.itemId], imageEditor.itemIds()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         let itemC = ImageEditorItem(itemType: .test) | 
					
						
							|  |  |  |         imageEditor.append(item: itemC) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertFalse(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(2, imageEditor.itemCount()) | 
					
						
							|  |  |  |         XCTAssertEqual([itemB.itemId, itemC.itemId], imageEditor.itemIds()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         imageEditor.undo() | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canUndo()) | 
					
						
							|  |  |  |         XCTAssertTrue(imageEditor.canRedo()) | 
					
						
							|  |  |  |         XCTAssertEqual(1, imageEditor.itemCount()) | 
					
						
							|  |  |  |         XCTAssertEqual([itemB.itemId], imageEditor.itemIds()) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |