How to use testMultipleSnapshots method of CancellingWKWebViewNavigationDelegate class

Best Swift-snapshot-testing code snippet using CancellingWKWebViewNavigationDelegate.testMultipleSnapshots

SnapshotTestingTests.swift

Source:SnapshotTestingTests.swift Github

copy

Full Screen

...190// assertSnapshot(matching: view, as: .image, named: platform)191// }192// #endif193 }194 func testMultipleSnapshots() {195 assertSnapshot(matching: [1], as: .dump)196 assertSnapshot(matching: [1, 2], as: .dump)197 }198 func testNamedAssertion() {199 struct User { let id: Int, name: String, bio: String }200 let user = User(id: 1, name: "Blobby", bio: "Blobbed around the world.")201 assertSnapshot(matching: user, as: .dump, named: "named")202 }203 func testNSBezierPath() {204 #if os(macOS)205 let path = NSBezierPath.heart206 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {207 assertSnapshot(matching: path, as: .image, named: "macOS")208 }209 assertSnapshot(matching: path, as: .elementsDescription, named: "macOS")210 #endif211 }212 func testNSView() {213 #if os(macOS)214 let button = NSButton()215 button.bezelStyle = .rounded216 button.title = "Push Me"217 button.sizeToFit()218 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {219 assertSnapshot(matching: button, as: .image)220 assertSnapshot(matching: button, as: .recursiveDescription)221 }222 #endif223 }224 225 func testNSViewWithLayer() {226 #if os(macOS)227 let view = NSView()228 view.frame = CGRect(x: 0.0, y: 0.0, width: 10.0, height: 10.0)229 view.wantsLayer = true230 view.layer?.backgroundColor = NSColor.green.cgColor231 view.layer?.cornerRadius = 5232 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {233 assertSnapshot(matching: view, as: .image)234 assertSnapshot(matching: view, as: .recursiveDescription)235 }236 #endif237 }238 func testPrecision() {239 #if os(iOS) || os(macOS) || os(tvOS)240 #if os(iOS) || os(tvOS)241 let label = UILabel()242 #if os(iOS)243 label.frame = CGRect(origin: .zero, size: CGSize(width: 43.5, height: 20.5))244 #elseif os(tvOS)245 label.frame = CGRect(origin: .zero, size: CGSize(width: 98, height: 46))246 #endif247 label.backgroundColor = .white248 #elseif os(macOS)249 let label = NSTextField()250 label.frame = CGRect(origin: .zero, size: CGSize(width: 37, height: 16))251 label.backgroundColor = .white252 label.isBezeled = false253 label.isEditable = false254 #endif255 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {256 label.text = "Hello."257 assertSnapshot(matching: label, as: .image(precision: 0.9), named: platform)258 label.text = "Hello"259 assertSnapshot(matching: label, as: .image(precision: 0.9), named: platform)260 }261 #endif262 }263 func testSCNView() {264// #if os(iOS) || os(macOS) || os(tvOS)265// // NB: CircleCI crashes while trying to instantiate SCNView.266// if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {267// let scene = SCNScene()268//269// let sphereGeometry = SCNSphere(radius: 3)270// sphereGeometry.segmentCount = 200271// let sphereNode = SCNNode(geometry: sphereGeometry)272// sphereNode.position = SCNVector3Zero273// scene.rootNode.addChildNode(sphereNode)274//275// sphereGeometry.firstMaterial?.diffuse.contents = URL(fileURLWithPath: String(#file), isDirectory: false)276// .deletingLastPathComponent()277// .appendingPathComponent("__Fixtures__/earth.png")278//279// let cameraNode = SCNNode()280// cameraNode.camera = SCNCamera()281// cameraNode.position = SCNVector3Make(0, 0, 8)282// scene.rootNode.addChildNode(cameraNode)283//284// let omniLight = SCNLight()285// omniLight.type = .omni286// let omniLightNode = SCNNode()287// omniLightNode.light = omniLight288// omniLightNode.position = SCNVector3Make(10, 10, 10)289// scene.rootNode.addChildNode(omniLightNode)290//291// assertSnapshot(292// matching: scene,293// as: .image(size: .init(width: 500, height: 500)),294// named: platform295// )296// }297// #endif298 }299 func testSKView() {300// #if os(iOS) || os(macOS) || os(tvOS)301// // NB: CircleCI crashes while trying to instantiate SKView.302// if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {303// let scene = SKScene(size: .init(width: 50, height: 50))304// let node = SKShapeNode(circleOfRadius: 15)305// node.fillColor = .red306// node.position = .init(x: 25, y: 25)307// scene.addChild(node)308//309// assertSnapshot(310// matching: scene,311// as: .image(size: .init(width: 50, height: 50)),312// named: platform313// )314// }315// #endif316 }317 func testTableViewController() {318 #if os(iOS)319 class TableViewController: UITableViewController {320 override func viewDidLoad() {321 super.viewDidLoad()322 self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")323 }324 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {325 return 10326 }327 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {328 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)329 cell.textLabel?.text = "\(indexPath.row)"330 return cell331 }332 }333 let tableViewController = TableViewController()334 assertSnapshot(matching: tableViewController, as: .image(on: .iPhoneSe))335 #endif336 }337 func testAssertMultipleSnapshot() {338 #if os(iOS)339 class TableViewController: UITableViewController {340 override func viewDidLoad() {341 super.viewDidLoad()342 self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")343 }344 override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {345 return 10346 }347 override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {348 let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)349 cell.textLabel?.text = "\(indexPath.row)"350 return cell351 }352 }353 let tableViewController = TableViewController()354 assertSnapshots(matching: tableViewController, as: ["iPhoneSE-image" : .image(on: .iPhoneSe), "iPad-image" : .image(on: .iPadMini)])355 assertSnapshots(matching: tableViewController, as: [.image(on: .iPhoneX), .image(on: .iPhoneXsMax)])356 #endif357 }358 func testTraits() {359 #if os(iOS) || os(tvOS)360 if #available(iOS 11.0, tvOS 11.0, *) {361 class MyViewController: UIViewController {362 let topLabel = UILabel()363 let leadingLabel = UILabel()364 let trailingLabel = UILabel()365 let bottomLabel = UILabel()366 override func viewDidLoad() {367 super.viewDidLoad()368 self.navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .add, target: nil, action: nil)369 self.view.backgroundColor = .white370 self.topLabel.text = "What's"371 self.leadingLabel.text = "the"372 self.trailingLabel.text = "point"373 self.bottomLabel.text = "?"374 self.topLabel.translatesAutoresizingMaskIntoConstraints = false375 self.leadingLabel.translatesAutoresizingMaskIntoConstraints = false376 self.trailingLabel.translatesAutoresizingMaskIntoConstraints = false377 self.bottomLabel.translatesAutoresizingMaskIntoConstraints = false378 self.view.addSubview(self.topLabel)379 self.view.addSubview(self.leadingLabel)380 self.view.addSubview(self.trailingLabel)381 self.view.addSubview(self.bottomLabel)382 NSLayoutConstraint.activate([383 self.topLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),384 self.topLabel.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),385 self.leadingLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),386 self.leadingLabel.trailingAnchor.constraint(lessThanOrEqualTo: self.view.safeAreaLayoutGuide.centerXAnchor),387// self.leadingLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),388 self.leadingLabel.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),389 self.trailingLabel.leadingAnchor.constraint(greaterThanOrEqualTo: self.view.safeAreaLayoutGuide.centerXAnchor),390 self.trailingLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),391 self.trailingLabel.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),392 self.bottomLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor),393 self.bottomLabel.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),394 ])395 }396 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {397 super.traitCollectionDidChange(previousTraitCollection)398 self.topLabel.font = .preferredFont(forTextStyle: .headline, compatibleWith: self.traitCollection)399 self.leadingLabel.font = .preferredFont(forTextStyle: .body, compatibleWith: self.traitCollection)400 self.trailingLabel.font = .preferredFont(forTextStyle: .body, compatibleWith: self.traitCollection)401 self.bottomLabel.font = .preferredFont(forTextStyle: .subheadline, compatibleWith: self.traitCollection)402 self.view.setNeedsUpdateConstraints()403 self.view.updateConstraintsIfNeeded()404 }405 }406 let viewController = MyViewController()407 #if os(iOS)408 assertSnapshot(matching: viewController, as: .image(on: .iPhoneSe), named: "iphone-se")409 assertSnapshot(matching: viewController, as: .image(on: .iPhone8), named: "iphone-8")410 assertSnapshot(matching: viewController, as: .image(on: .iPhone8Plus), named: "iphone-8-plus")411 assertSnapshot(matching: viewController, as: .image(on: .iPhoneX), named: "iphone-x")412 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXr), named: "iphone-xr")413 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXsMax), named: "iphone-xs-max")414 assertSnapshot(matching: viewController, as: .image(on: .iPadMini), named: "ipad-mini")415 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7), named: "ipad-9-7")416 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2), named: "ipad-10-2")417 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5), named: "ipad-pro-10-5")418 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11), named: "ipad-pro-11")419 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9), named: "ipad-pro-12-9")420 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhoneSe), named: "iphone-se")421 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhone8), named: "iphone-8")422 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhone8Plus), named: "iphone-8-plus")423 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhoneX), named: "iphone-x")424 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhoneXr), named: "iphone-xr")425 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPhoneXsMax), named: "iphone-xs-max")426 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPadMini), named: "ipad-mini")427 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPad9_7), named: "ipad-9-7")428 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPad10_2), named: "ipad-10-2")429 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPadPro10_5), named: "ipad-pro-10-5")430 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPadPro11), named: "ipad-pro-11")431 assertSnapshot(matching: viewController, as: .recursiveDescription(on: .iPadPro12_9), named: "ipad-pro-12-9")432 assertSnapshot(matching: viewController, as: .image(on: .iPhoneSe(.portrait)), named: "iphone-se")433 assertSnapshot(matching: viewController, as: .image(on: .iPhone8(.portrait)), named: "iphone-8")434 assertSnapshot(matching: viewController, as: .image(on: .iPhone8Plus(.portrait)), named: "iphone-8-plus")435 assertSnapshot(matching: viewController, as: .image(on: .iPhoneX(.portrait)), named: "iphone-x")436 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXr(.portrait)), named: "iphone-xr")437 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXsMax(.portrait)), named: "iphone-xs-max")438 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.landscape)), named: "ipad-mini")439 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.landscape)), named: "ipad-9-7")440 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.landscape)), named: "ipad-10-2")441 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.landscape)), named: "ipad-pro-10-5")442 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.landscape)), named: "ipad-pro-11")443 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.landscape)), named: "ipad-pro-12-9")444 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.landscape(splitView: .oneThird))), named: "ipad-mini-33-split-landscape")445 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.landscape(splitView: .oneHalf))), named: "ipad-mini-50-split-landscape")446 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.landscape(splitView: .twoThirds))), named: "ipad-mini-66-split-landscape")447 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.portrait(splitView: .oneThird))), named: "ipad-mini-33-split-portrait")448 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.portrait(splitView: .twoThirds))), named: "ipad-mini-66-split-portrait")449 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.landscape(splitView: .oneThird))), named: "ipad-9-7-33-split-landscape")450 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.landscape(splitView: .oneHalf))), named: "ipad-9-7-50-split-landscape")451 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.landscape(splitView: .twoThirds))), named: "ipad-9-7-66-split-landscape")452 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.portrait(splitView: .oneThird))), named: "ipad-9-7-33-split-portrait")453 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.portrait(splitView: .twoThirds))), named: "ipad-9-7-66-split-portrait")454 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.landscape(splitView: .oneThird))), named: "ipad-10-2-split-landscape")455 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.landscape(splitView: .oneHalf))), named: "ipad-10-2-50-split-landscape")456 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.landscape(splitView: .twoThirds))), named: "ipad-10-2-66-split-landscape")457 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.portrait(splitView: .oneThird))), named: "ipad-10-2-33-split-portrait")458 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.portrait(splitView: .twoThirds))), named: "ipad-10-2-66-split-portrait")459 460 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.landscape(splitView: .oneThird))), named: "ipad-pro-10inch-33-split-landscape")461 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.landscape(splitView: .oneHalf))), named: "ipad-pro-10inch-50-split-landscape")462 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.landscape(splitView: .twoThirds))), named: "ipad-pro-10inch-66-split-landscape")463 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.portrait(splitView: .oneThird))), named: "ipad-pro-10inch-33-split-portrait")464 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.portrait(splitView: .twoThirds))), named: "ipad-pro-10inch-66-split-portrait")465 466 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.landscape(splitView: .oneThird))), named: "ipad-pro-11inch-33-split-landscape")467 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.landscape(splitView: .oneHalf))), named: "ipad-pro-11inch-50-split-landscape")468 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.landscape(splitView: .twoThirds))), named: "ipad-pro-11inch-66-split-landscape")469 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.portrait(splitView: .oneThird))), named: "ipad-pro-11inch-33-split-portrait")470 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.portrait(splitView: .twoThirds))), named: "ipad-pro-11inch-66-split-portrait")471 472 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.landscape(splitView: .oneThird))), named: "ipad-pro-12inch-33-split-landscape")473 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.landscape(splitView: .oneHalf))), named: "ipad-pro-12inch-50-split-landscape")474 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.landscape(splitView: .twoThirds))), named: "ipad-pro-12inch-66-split-landscape")475 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.portrait(splitView: .oneThird))), named: "ipad-pro-12inch-33-split-portrait")476 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.portrait(splitView: .twoThirds))), named: "ipad-pro-12inch-66-split-portrait")477 478 assertSnapshot(479 matching: viewController, as: .image(on: .iPhoneSe(.landscape)), named: "iphone-se-alternative")480 assertSnapshot(481 matching: viewController, as: .image(on: .iPhone8(.landscape)), named: "iphone-8-alternative")482 assertSnapshot(483 matching: viewController, as: .image(on: .iPhone8Plus(.landscape)), named: "iphone-8-plus-alternative")484 assertSnapshot(485 matching: viewController, as: .image(on: .iPhoneX(.landscape)), named: "iphone-x-alternative")486 assertSnapshot(487 matching: viewController, as: .image(on: .iPhoneXr(.landscape)), named: "iphone-xr-alternative")488 assertSnapshot(489 matching: viewController, as: .image(on: .iPhoneXsMax(.landscape)), named: "iphone-xs-max-alternative")490 assertSnapshot(491 matching: viewController, as: .image(on: .iPadMini(.portrait)), named: "ipad-mini-alternative")492 assertSnapshot(493 matching: viewController, as: .image(on: .iPad9_7(.portrait)), named: "ipad-9-7-alternative")494 assertSnapshot(495 matching: viewController, as: .image(on: .iPad10_2(.portrait)), named: "ipad-10-2-alternative")496 assertSnapshot(497 matching: viewController, as: .image(on: .iPadPro10_5(.portrait)), named: "ipad-pro-10-5-alternative")498 assertSnapshot(499 matching: viewController, as: .image(on: .iPadPro11(.portrait)), named: "ipad-pro-11-alternative")500 assertSnapshot(501 matching: viewController, as: .image(on: .iPadPro12_9(.portrait)), named: "ipad-pro-12-9-alternative")502 allContentSizes.forEach { name, contentSize in503 assertSnapshot(504 matching: viewController,505 as: .image(on: .iPhoneSe, traits: .init(preferredContentSizeCategory: contentSize)),506 named: "iphone-se-\(name)"507 )508 }509 #elseif os(tvOS)510 assertSnapshot(511 matching: viewController, as: .image(on: .tv), named: "tv")512 assertSnapshot(513 matching: viewController, as: .image(on: .tv4K), named: "tv4k")514 #endif515 }516 #endif517 }518 func testTraitsEmbeddedInTabNavigation() {519 #if os(iOS)520 if #available(iOS 11.0, *) {521 class MyViewController: UIViewController {522 let topLabel = UILabel()523 let leadingLabel = UILabel()524 let trailingLabel = UILabel()525 let bottomLabel = UILabel()526 override func viewDidLoad() {527 super.viewDidLoad()528 self.navigationItem.leftBarButtonItem = .init(barButtonSystemItem: .add, target: nil, action: nil)529 self.view.backgroundColor = .white530 self.topLabel.text = "What's"531 self.leadingLabel.text = "the"532 self.trailingLabel.text = "point"533 self.bottomLabel.text = "?"534 self.topLabel.translatesAutoresizingMaskIntoConstraints = false535 self.leadingLabel.translatesAutoresizingMaskIntoConstraints = false536 self.trailingLabel.translatesAutoresizingMaskIntoConstraints = false537 self.bottomLabel.translatesAutoresizingMaskIntoConstraints = false538 self.view.addSubview(self.topLabel)539 self.view.addSubview(self.leadingLabel)540 self.view.addSubview(self.trailingLabel)541 self.view.addSubview(self.bottomLabel)542 NSLayoutConstraint.activate([543 self.topLabel.topAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.topAnchor),544 self.topLabel.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),545 self.leadingLabel.leadingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.leadingAnchor),546 self.leadingLabel.trailingAnchor.constraint(lessThanOrEqualTo: self.view.safeAreaLayoutGuide.centerXAnchor),547// self.leadingLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),548 self.leadingLabel.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),549 self.trailingLabel.leadingAnchor.constraint(greaterThanOrEqualTo: self.view.safeAreaLayoutGuide.centerXAnchor),550 self.trailingLabel.trailingAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.trailingAnchor),551 self.trailingLabel.centerYAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerYAnchor),552 self.bottomLabel.bottomAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.bottomAnchor),553 self.bottomLabel.centerXAnchor.constraint(equalTo: self.view.safeAreaLayoutGuide.centerXAnchor),554 ])555 }556 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {557 super.traitCollectionDidChange(previousTraitCollection)558 self.topLabel.font = .preferredFont(forTextStyle: .headline, compatibleWith: self.traitCollection)559 self.leadingLabel.font = .preferredFont(forTextStyle: .body, compatibleWith: self.traitCollection)560 self.trailingLabel.font = .preferredFont(forTextStyle: .body, compatibleWith: self.traitCollection)561 self.bottomLabel.font = .preferredFont(forTextStyle: .subheadline, compatibleWith: self.traitCollection)562 self.view.setNeedsUpdateConstraints()563 self.view.updateConstraintsIfNeeded()564 }565 }566 let myViewController = MyViewController()567 let navController = UINavigationController(rootViewController: myViewController)568 let viewController = UITabBarController()569 viewController.setViewControllers([navController], animated: false)570 assertSnapshot(matching: viewController, as: .image(on: .iPhoneSe), named: "iphone-se")571 assertSnapshot(matching: viewController, as: .image(on: .iPhone8), named: "iphone-8")572 assertSnapshot(matching: viewController, as: .image(on: .iPhone8Plus), named: "iphone-8-plus")573 assertSnapshot(matching: viewController, as: .image(on: .iPhoneX), named: "iphone-x")574 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXr), named: "iphone-xr")575 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXsMax), named: "iphone-xs-max")576 assertSnapshot(matching: viewController, as: .image(on: .iPadMini), named: "ipad-mini")577 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7), named: "ipad-9-7")578 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2), named: "ipad-10-2")579 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5), named: "ipad-pro-10-5")580 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11), named: "ipad-pro-11")581 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9), named: "ipad-pro-12-9")582 assertSnapshot(matching: viewController, as: .image(on: .iPhoneSe(.portrait)), named: "iphone-se")583 assertSnapshot(matching: viewController, as: .image(on: .iPhone8(.portrait)), named: "iphone-8")584 assertSnapshot(matching: viewController, as: .image(on: .iPhone8Plus(.portrait)), named: "iphone-8-plus")585 assertSnapshot(matching: viewController, as: .image(on: .iPhoneX(.portrait)), named: "iphone-x")586 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXr(.portrait)), named: "iphone-xr")587 assertSnapshot(matching: viewController, as: .image(on: .iPhoneXsMax(.portrait)), named: "iphone-xs-max")588 assertSnapshot(matching: viewController, as: .image(on: .iPadMini(.landscape)), named: "ipad-mini")589 assertSnapshot(matching: viewController, as: .image(on: .iPad9_7(.landscape)), named: "ipad-9-7")590 assertSnapshot(matching: viewController, as: .image(on: .iPad10_2(.landscape)), named: "ipad-10-2")591 assertSnapshot(matching: viewController, as: .image(on: .iPadPro10_5(.landscape)), named: "ipad-pro-10-5")592 assertSnapshot(matching: viewController, as: .image(on: .iPadPro11(.landscape)), named: "ipad-pro-11")593 assertSnapshot(matching: viewController, as: .image(on: .iPadPro12_9(.landscape)), named: "ipad-pro-12-9")594 assertSnapshot(595 matching: viewController, as: .image(on: .iPhoneSe(.landscape)), named: "iphone-se-alternative")596 assertSnapshot(597 matching: viewController, as: .image(on: .iPhone8(.landscape)), named: "iphone-8-alternative")598 assertSnapshot(599 matching: viewController, as: .image(on: .iPhone8Plus(.landscape)), named: "iphone-8-plus-alternative")600 assertSnapshot(601 matching: viewController, as: .image(on: .iPhoneX(.landscape)), named: "iphone-x-alternative")602 assertSnapshot(603 matching: viewController, as: .image(on: .iPhoneXr(.landscape)), named: "iphone-xr-alternative")604 assertSnapshot(605 matching: viewController, as: .image(on: .iPhoneXsMax(.landscape)), named: "iphone-xs-max-alternative")606 assertSnapshot(607 matching: viewController, as: .image(on: .iPadMini(.portrait)), named: "ipad-mini-alternative")608 assertSnapshot(609 matching: viewController, as: .image(on: .iPad9_7(.portrait)), named: "ipad-9-7-alternative")610 assertSnapshot(611 matching: viewController, as: .image(on: .iPad10_2(.portrait)), named: "ipad-10-2-alternative")612 assertSnapshot(613 matching: viewController, as: .image(on: .iPadPro10_5(.portrait)), named: "ipad-pro-10-5-alternative")614 assertSnapshot(615 matching: viewController, as: .image(on: .iPadPro11(.portrait)), named: "ipad-pro-11-alternative")616 assertSnapshot(617 matching: viewController, as: .image(on: .iPadPro12_9(.portrait)), named: "ipad-pro-12-9-alternative")618 }619 #endif620 }621 func testCollectionViewsWithMultipleScreenSizes() {622 #if os(iOS)623 final class CollectionViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout {624 let flowLayout: UICollectionViewFlowLayout = {625 let layout = UICollectionViewFlowLayout()626 layout.scrollDirection = .horizontal627 layout.minimumLineSpacing = 20628 return layout629 }()630 lazy var collectionView = UICollectionView(frame: .zero, collectionViewLayout: flowLayout)631 override func viewDidLoad() {632 super.viewDidLoad()633 view.backgroundColor = .white634 view.addSubview(collectionView)635 collectionView.backgroundColor = .white636 collectionView.dataSource = self637 collectionView.delegate = self638 collectionView.register(UICollectionViewCell.self, forCellWithReuseIdentifier: "Cell")639 collectionView.translatesAutoresizingMaskIntoConstraints = false640 NSLayoutConstraint.activate([641 collectionView.leadingAnchor.constraint(equalTo: view.layoutMarginsGuide.leadingAnchor),642 collectionView.topAnchor.constraint(equalTo: view.layoutMarginsGuide.topAnchor),643 collectionView.trailingAnchor.constraint(equalTo: view.layoutMarginsGuide.trailingAnchor),644 collectionView.bottomAnchor.constraint(equalTo: view.layoutMarginsGuide.bottomAnchor)645 ])646 collectionView.reloadData()647 }648 override func viewDidLayoutSubviews() {649 super.viewDidLayoutSubviews()650 collectionView.collectionViewLayout.invalidateLayout()651 }652 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {653 super.traitCollectionDidChange(previousTraitCollection)654 collectionView.collectionViewLayout.invalidateLayout()655 }656 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {657 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)658 cell.contentView.backgroundColor = .orange659 return cell660 }661 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {662 return 20663 }664 func collectionView(665 _ collectionView: UICollectionView,666 layout collectionViewLayout: UICollectionViewLayout,667 sizeForItemAt indexPath: IndexPath668 ) -> CGSize {669 return CGSize(670 width: min(collectionView.frame.width - 50, 300),671 height: collectionView.frame.height672 )673 }674 }675 let viewController = CollectionViewController()676 assertSnapshots(matching: viewController, as: [677 "ipad": .image(on: .iPadPro12_9),678 "iphoneSe": .image(on: .iPhoneSe),679 "iphone8": .image(on: .iPhone8),680 "iphoneMax": .image(on: .iPhoneXsMax)681 ])682 #endif683 }684 func testTraitsWithView() {685 #if os(iOS)686 if #available(iOS 11.0, *) {687 let label = UILabel()688 label.font = .preferredFont(forTextStyle: .title1)689 label.adjustsFontForContentSizeCategory = true690 label.text = "What's the point?"691 allContentSizes.forEach { name, contentSize in692 assertSnapshot(693 matching: label,694 as: .image(traits: .init(preferredContentSizeCategory: contentSize)),695 named: "label-\(name)"696 )697 }698 }699 #endif700 }701 func testTraitsWithViewController() {702 #if os(iOS)703 let label = UILabel()704 label.font = .preferredFont(forTextStyle: .title1)705 label.adjustsFontForContentSizeCategory = true706 label.text = "What's the point?"707 let viewController = UIViewController()708 viewController.view.addSubview(label)709 label.translatesAutoresizingMaskIntoConstraints = false710 NSLayoutConstraint.activate([711 label.leadingAnchor.constraint(equalTo: viewController.view.layoutMarginsGuide.leadingAnchor),712 label.topAnchor.constraint(equalTo: viewController.view.layoutMarginsGuide.topAnchor),713 label.trailingAnchor.constraint(equalTo: viewController.view.layoutMarginsGuide.trailingAnchor)714 ])715 allContentSizes.forEach { name, contentSize in716 assertSnapshot(717 matching: viewController,718 as: .recursiveDescription(on: .iPhoneSe, traits: .init(preferredContentSizeCategory: contentSize)),719 named: "label-\(name)"720 )721 }722 #endif723 }724 func testUIBezierPath() {725 #if os(iOS) || os(tvOS)726 let path = UIBezierPath.heart727 let osName: String728 #if os(iOS)729 osName = "iOS"730 #elseif os(tvOS)731 osName = "tvOS"732 #endif733 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {734 assertSnapshot(matching: path, as: .image, named: osName)735 }736 if #available(iOS 11.0, tvOS 11.0, *) {737 assertSnapshot(matching: path, as: .elementsDescription, named: osName)738 }739 #endif740 }741 func testUIView() {742 #if os(iOS)743 let view = UIButton(type: .contactAdd)744 assertSnapshot(matching: view, as: .image)745 assertSnapshot(matching: view, as: .recursiveDescription)746 #endif747 }748 func testUIViewControllerLifeCycle() {749 #if os(iOS)750 class ViewController: UIViewController {751 let viewDidLoadExpectation: XCTestExpectation752 let viewWillAppearExpectation: XCTestExpectation753 let viewDidAppearExpectation: XCTestExpectation754 let viewWillDisappearExpectation: XCTestExpectation755 let viewDidDisappearExpectation: XCTestExpectation756 init(viewDidLoadExpectation: XCTestExpectation,757 viewWillAppearExpectation: XCTestExpectation,758 viewDidAppearExpectation: XCTestExpectation,759 viewWillDisappearExpectation: XCTestExpectation,760 viewDidDisappearExpectation: XCTestExpectation){761 self.viewDidLoadExpectation = viewDidLoadExpectation762 self.viewWillAppearExpectation = viewWillAppearExpectation763 self.viewDidAppearExpectation = viewDidAppearExpectation764 self.viewWillDisappearExpectation = viewWillDisappearExpectation765 self.viewDidDisappearExpectation = viewDidDisappearExpectation766 super.init(nibName: nil, bundle: nil)767 }768 required init?(coder: NSCoder) {769 fatalError("init(coder:) has not been implemented")770 }771 override func viewDidLoad() {772 super.viewDidLoad()773 viewDidLoadExpectation.fulfill()774 }775 override func viewWillAppear(_ animated: Bool) {776 super.viewWillAppear(animated)777 viewWillAppearExpectation.fulfill()778 }779 override func viewDidAppear(_ animated: Bool) {780 super.viewDidAppear(animated)781 viewDidAppearExpectation.fulfill()782 }783 override func viewWillDisappear(_ animated: Bool) {784 super.viewWillDisappear(animated)785 viewWillDisappearExpectation.fulfill()786 }787 override func viewDidDisappear(_ animated: Bool) {788 super.viewDidDisappear(animated)789 viewDidDisappearExpectation.fulfill()790 }791 }792 let viewDidLoadExpectation = expectation(description: "viewDidLoad")793 let viewWillAppearExpectation = expectation(description: "viewWillAppear")794 let viewDidAppearExpectation = expectation(description: "viewDidAppear")795 let viewWillDisappearExpectation = expectation(description: "viewWillDisappear")796 let viewDidDisappearExpectation = expectation(description: "viewDidDisappear")797 viewWillAppearExpectation.expectedFulfillmentCount = 4798 viewDidAppearExpectation.expectedFulfillmentCount = 4799 viewWillDisappearExpectation.expectedFulfillmentCount = 4800 viewDidDisappearExpectation.expectedFulfillmentCount = 4801 let viewController = ViewController(802 viewDidLoadExpectation: viewDidLoadExpectation,803 viewWillAppearExpectation: viewWillAppearExpectation,804 viewDidAppearExpectation: viewDidAppearExpectation,805 viewWillDisappearExpectation: viewWillDisappearExpectation,806 viewDidDisappearExpectation: viewDidDisappearExpectation807 )808 assertSnapshot(matching: viewController, as: .image)809 assertSnapshot(matching: viewController, as: .image)810 wait(for: [811 viewDidLoadExpectation,812 viewWillAppearExpectation,813 viewDidAppearExpectation,814 viewWillDisappearExpectation,815 viewDidDisappearExpectation,816 ], timeout: 1.0, enforceOrder: true)817 #endif818 }819 func testCALayer() {820 #if os(iOS)821 let layer = CALayer()822 layer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)823 layer.backgroundColor = UIColor.red.cgColor824 layer.borderWidth = 4.0825 layer.borderColor = UIColor.black.cgColor826 assertSnapshot(matching: layer, as: .image)827 #endif828 }829 func testCALayerWithGradient() {830 #if os(iOS)831 let baseLayer = CALayer()832 baseLayer.frame = CGRect(x: 0, y: 0, width: 100, height: 100)833 let gradientLayer = CAGradientLayer()834 gradientLayer.colors = [UIColor.red.cgColor, UIColor.yellow.cgColor]835 gradientLayer.frame = baseLayer.frame836 baseLayer.addSublayer(gradientLayer)837 assertSnapshot(matching: baseLayer, as: .image)838 #endif839 }840 func testViewControllerHierarchy() {841 #if os(iOS)842 let page = UIPageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal)843 page.setViewControllers([UIViewController()], direction: .forward, animated: false)844 let tab = UITabBarController()845 tab.viewControllers = [846 UINavigationController(rootViewController: page),847 UINavigationController(rootViewController: UIViewController()),848 UINavigationController(rootViewController: UIViewController()),849 UINavigationController(rootViewController: UIViewController()),850 UINavigationController(rootViewController: UIViewController())851 ]852 assertSnapshot(matching: tab, as: .hierarchy)853 #endif854 }855 func testURLRequest() {856 var get = URLRequest(url: URL(string: "https://www.pointfree.co/")!)857 get.addValue("pf_session={}", forHTTPHeaderField: "Cookie")858 get.addValue("text/html", forHTTPHeaderField: "Accept")859 get.addValue("application/json", forHTTPHeaderField: "Content-Type")860 assertSnapshot(matching: get, as: .raw, named: "get")861 assertSnapshot(matching: get, as: .curl, named: "get-curl")862 var getWithQuery = URLRequest(url: URL(string: "https://www.pointfree.co?key_2=value_2&key_1=value_1&key_3=value_3")!)863 getWithQuery.addValue("pf_session={}", forHTTPHeaderField: "Cookie")864 getWithQuery.addValue("text/html", forHTTPHeaderField: "Accept")865 getWithQuery.addValue("application/json", forHTTPHeaderField: "Content-Type")866 assertSnapshot(matching: getWithQuery, as: .raw, named: "get-with-query")867 assertSnapshot(matching: getWithQuery, as: .curl, named: "get-with-query-curl")868 var post = URLRequest(url: URL(string: "https://www.pointfree.co/subscribe")!)869 post.httpMethod = "POST"870 post.addValue("pf_session={\"user_id\":\"0\"}", forHTTPHeaderField: "Cookie")871 post.addValue("text/html", forHTTPHeaderField: "Accept")872 post.httpBody = Data("pricing[billing]=monthly&pricing[lane]=individual".utf8)873 assertSnapshot(matching: post, as: .raw, named: "post")874 assertSnapshot(matching: post, as: .curl, named: "post-curl")875 876 var postWithJSON = URLRequest(url: URL(string: "http://dummy.restapiexample.com/api/v1/create")!)877 postWithJSON.httpMethod = "POST"878 postWithJSON.addValue("application/json", forHTTPHeaderField: "Content-Type")879 postWithJSON.addValue("application/json", forHTTPHeaderField: "Accept")880 postWithJSON.httpBody = Data("{\"name\":\"tammy134235345235\", \"salary\":0, \"age\":\"tammy133\"}".utf8)881 assertSnapshot(matching: postWithJSON, as: .raw, named: "post-with-json")882 assertSnapshot(matching: postWithJSON, as: .curl, named: "post-with-json-curl")883 var head = URLRequest(url: URL(string: "https://www.pointfree.co/")!)884 head.httpMethod = "HEAD"885 head.addValue("pf_session={}", forHTTPHeaderField: "Cookie")886 assertSnapshot(matching: head, as: .raw, named: "head")887 assertSnapshot(matching: head, as: .curl, named: "head-curl")888 post = URLRequest(url: URL(string: "https://www.pointfree.co/subscribe")!)889 post.httpMethod = "POST"890 post.addValue("pf_session={\"user_id\":\"0\"}", forHTTPHeaderField: "Cookie")891 post.addValue("application/json", forHTTPHeaderField: "Accept")892 post.httpBody = Data("""893 {"pricing": {"lane": "individual","billing": "monthly"}}894 """.utf8)895 _assertInlineSnapshot(matching: post, as: .raw(pretty: true), with: """896 POST https://www.pointfree.co/subscribe897 Accept: application/json898 Cookie: pf_session={"user_id":"0"}899 900 {901 "pricing" : {902 "billing" : "monthly",903 "lane" : "individual"904 }905 }906 """)907 }908 func testWebView() throws {909 #if os(iOS) || os(macOS)910 let fixtureUrl = URL(fileURLWithPath: String(#file), isDirectory: false)911 .deletingLastPathComponent()912 .appendingPathComponent("__Fixtures__/pointfree.html")913 let html = try String(contentsOf: fixtureUrl)914 let webView = WKWebView()915 webView.loadHTMLString(html, baseURL: nil)916 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {917 assertSnapshot(918 matching: webView,919 as: .image(size: .init(width: 800, height: 600)),920 named: platform921 )922 }923 #endif924 }925 func testViewWithZeroHeightOrWidth() {926 #if os(iOS) || os(tvOS)927 var rect = CGRect(x: 0, y: 0, width: 350, height: 0)928 var view = UIView(frame: rect)929 view.backgroundColor = .red930 assertSnapshot(matching: view, as: .image, named: "noHeight")931 932 rect = CGRect(x: 0, y: 0, width: 0, height: 350)933 view = UIView(frame: rect)934 view.backgroundColor = .green935 assertSnapshot(matching: view, as: .image, named: "noWidth")936 rect = CGRect(x: 0, y: 0, width: 0, height: 0)937 view = UIView(frame: rect)938 view.backgroundColor = .blue939 assertSnapshot(matching: view, as: .image, named: "noWidth.noHeight")940 #endif941 }942 func testEmbeddedWebView() throws {943 #if os(iOS)944 let label = UILabel()945 label.text = "Hello, Blob!"946 let fixtureUrl = URL(fileURLWithPath: String(#file), isDirectory: false)947 .deletingLastPathComponent()948 .appendingPathComponent("__Fixtures__/pointfree.html")949 let html = try String(contentsOf: fixtureUrl)950 let webView = WKWebView()951 webView.loadHTMLString(html, baseURL: nil)952 webView.isHidden = true953 let stackView = UIStackView(arrangedSubviews: [label, webView])954 stackView.axis = .vertical955 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {956 assertSnapshot(957 matching: stackView,958 as: .image(size: .init(width: 800, height: 600)),959 named: platform960 )961 }962 #endif963 }964 #if os(iOS) || os(macOS)965 final class ManipulatingWKWebViewNavigationDelegate: NSObject, WKNavigationDelegate {966 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {967 webView.evaluateJavaScript("document.body.children[0].classList.remove(\"hero\")") // Change layout968 }969 }970 func testWebViewWithManipulatingNavigationDelegate() throws {971 let manipulatingWKWebViewNavigationDelegate = ManipulatingWKWebViewNavigationDelegate()972 let webView = WKWebView()973 webView.navigationDelegate = manipulatingWKWebViewNavigationDelegate974 let fixtureUrl = URL(fileURLWithPath: String(#file), isDirectory: false)975 .deletingLastPathComponent()976 .appendingPathComponent("__Fixtures__/pointfree.html")977 let html = try String(contentsOf: fixtureUrl)978 webView.loadHTMLString(html, baseURL: nil)979 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {980 assertSnapshot(981 matching: webView,982 as: .image(size: .init(width: 800, height: 600)),983 named: platform984 )985 }986 _ = manipulatingWKWebViewNavigationDelegate987 }988 #if os(iOS) || os(macOS)989 func testWebViewWithRealUrl() throws {990 let manipulatingWKWebViewNavigationDelegate = ManipulatingWKWebViewNavigationDelegate()991 let webView = WKWebView()992 webView.navigationDelegate = manipulatingWKWebViewNavigationDelegate993 webView.load(URLRequest(url: URL(string: "https://www.pointfree.co")!))994 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {995 assertSnapshot(996 matching: webView,997 as: .image(size: .init(width: 800, height: 600)),998 named: platform999 )1000 }1001 _ = manipulatingWKWebViewNavigationDelegate1002 }1003 #endif1004 final class CancellingWKWebViewNavigationDelegate: NSObject, WKNavigationDelegate {1005 func webView(1006 _ webView: WKWebView,1007 decidePolicyFor navigationAction: WKNavigationAction,1008 decisionHandler: @escaping (WKNavigationActionPolicy) -> Void1009 ) {1010 decisionHandler(.cancel)1011 }1012 }1013 func testWebViewWithCancellingNavigationDelegate() throws {1014 let cancellingWKWebViewNavigationDelegate = CancellingWKWebViewNavigationDelegate()1015 let webView = WKWebView()1016 webView.navigationDelegate = cancellingWKWebViewNavigationDelegate1017 let fixtureUrl = URL(fileURLWithPath: String(#file), isDirectory: false)1018 .deletingLastPathComponent()1019 .appendingPathComponent("__Fixtures__/pointfree.html")1020 let html = try String(contentsOf: fixtureUrl)1021 webView.loadHTMLString(html, baseURL: nil)1022 if !ProcessInfo.processInfo.environment.keys.contains("GITHUB_WORKFLOW") {1023 assertSnapshot(1024 matching: webView,1025 as: .image(size: .init(width: 800, height: 600)),1026 named: platform1027 )1028 }1029 _ = cancellingWKWebViewNavigationDelegate1030 }1031 #endif1032 @available(iOS 13.0, *)1033 func testSwiftUIView_iOS() {1034 #if os(iOS)1035 struct MyView: SwiftUI.View {1036 var body: some SwiftUI.View {1037 HStack {1038 Image(systemName: "checkmark.circle.fill")1039 Text("Checked").fixedSize()1040 }1041 .padding(5)1042 .background(RoundedRectangle(cornerRadius: 5.0).fill(Color.blue))1043 .padding(10)1044 }1045 }1046 let view = MyView().background(Color.yellow)1047 assertSnapshot(matching: view, as: .image(traits: .init(userInterfaceStyle: .light)))1048 assertSnapshot(matching: view, as: .image(layout: .sizeThatFits, traits: .init(userInterfaceStyle: .light)), named: "size-that-fits")1049 assertSnapshot(matching: view, as: .image(layout: .fixed(width: 200.0, height: 100.0), traits: .init(userInterfaceStyle: .light)), named: "fixed")1050 assertSnapshot(matching: view, as: .image(layout: .device(config: .iPhoneSe), traits: .init(userInterfaceStyle: .light)), named: "device")1051 #endif1052 }1053 @available(tvOS 13.0, *)1054 func testSwiftUIView_tvOS() {1055 #if os(tvOS)1056 struct MyView: SwiftUI.View {1057 var body: some SwiftUI.View {1058 HStack {1059 Image(systemName: "checkmark.circle.fill")1060 Text("Checked").fixedSize()1061 }1062 .padding(5)1063 .background(RoundedRectangle(cornerRadius: 5.0).fill(Color.blue))1064 .padding(10)1065 }1066 }1067 let view = MyView().background(Color.yellow)1068 assertSnapshot(matching: view, as: .image())1069 assertSnapshot(matching: view, as: .image(layout: .sizeThatFits), named: "size-that-fits")1070 assertSnapshot(matching: view, as: .image(layout: .fixed(width: 300.0, height: 100.0)), named: "fixed")1071 assertSnapshot(matching: view, as: .image(layout: .device(config: .tv)), named: "device")1072 #endif1073 }1074 @available(*, deprecated)1075 func testIsRecordingProxy() {1076 SnapshotTesting.record = true1077 XCTAssertEqual(isRecording, true)1078 SnapshotTesting.record = false1079 XCTAssertEqual(isRecording, false)1080 }1081}1082#if os(iOS)1083private let allContentSizes =1084 [1085 "extra-small": UIContentSizeCategory.extraSmall,1086 "small": .small,1087 "medium": .medium,1088 "large": .large,1089 "extra-large": .extraLarge,1090 "extra-extra-large": .extraExtraLarge,1091 "extra-extra-extra-large": .extraExtraExtraLarge,1092 "accessibility-medium": .accessibilityMedium,1093 "accessibility-large": .accessibilityLarge,1094 "accessibility-extra-large": .accessibilityExtraLarge,1095 "accessibility-extra-extra-large": .accessibilityExtraExtraLarge,1096 "accessibility-extra-extra-extra-large": .accessibilityExtraExtraExtraLarge,1097 ]1098#endif1099#if os(Linux) || os(Windows)1100extension SnapshotTestingTests {1101 static var allTests : [(String, (SnapshotTestingTests) -> () throws -> Void)] {1102 return [1103 ("testAny", testAny),1104 ("testAnySnapshotStringConvertible", testAnySnapshotStringConvertible),1105 ("testAutolayout", testAutolayout),1106 ("testDeterministicDictionaryAndSetSnapshots", testDeterministicDictionaryAndSetSnapshots),1107 ("testEncodable", testEncodable),1108 ("testMixedViews", testMixedViews),1109 ("testMultipleSnapshots", testMultipleSnapshots),1110 ("testNamedAssertion", testNamedAssertion),1111 ("testPrecision", testPrecision),1112 ("testSCNView", testSCNView),1113 ("testSKView", testSKView),1114 ("testTableViewController", testTableViewController),1115 ("testTraits", testTraits),1116 ("testTraitsEmbeddedInTabNavigation", testTraitsEmbeddedInTabNavigation),1117 ("testTraitsWithView", testTraitsWithView),1118 ("testUIView", testUIView),1119 ("testURLRequest", testURLRequest),1120 ("testWebView", testWebView),1121 ]1122 }1123}...

Full Screen

Full Screen

SnapshotKitTests.swift

Source:SnapshotKitTests.swift Github

copy

Full Screen

...146 let user = User(id: 1, name: "Blobby", bio: "Blobbed around the world.")147 assertSnapshot(matching: user, as: .json)148 assertSnapshot(matching: user, as: .plist)149 }150 func testMultipleSnapshots() {151 assertSnapshot(matching: [1], as: .dump)152 assertSnapshot(matching: [1, 2], as: .dump)153 }154 func testNamedAssertion() {155 struct User { let id: Int, name: String, bio: String }156 let user = User(id: 1, name: "Blobby", bio: "Blobbed around the world.")157 assertSnapshot(matching: user, as: .dump, named: "named")158 }159 #if os(macOS)160 func testNSBezierPath() {161 let path = NSBezierPath.heart162 assertSnapshot(matching: path, as: .image, named: "macOS")163 assertSnapshot(matching: path, as: .elementsDescription, named: "macOS")164 }...

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1func testSnapshot() {2 let webView = WKWebView(frame: .zero)3 let delegate = CancellingWKWebViewNavigationDelegate()4 webView.load(URLRequest(url: url))5 delegate.testMultipleSnapshots(view: webView, count: 2)6}

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3@testable import CancelWKWebViewNavigation4class CancelWKWebViewNavigationTests: XCTestCase {5 override func setUp() {6 super.setUp()7 delegate = CancellingWKWebViewNavigationDelegate()8 webView = WKWebView(frame: CGRect.zero, configuration: WKWebViewConfiguration())9 }10 override func tearDown() {11 super.tearDown()12 }13 func testMultipleSnapshots() {14 let expectation = self.expectation(description: "Wait for web view to load")15 webView.load(URLRequest(url: url))16 waitForExpectations(timeout: 10, handler: nil)17 let snapshot1 = webView.snapshot()18 let snapshot2 = webView.snapshot()19 let snapshot3 = webView.snapshot()20 XCTAssertNotNil(snapshot1)21 XCTAssertNotNil(snapshot2)22 XCTAssertNotNil(snapshot3)23 }24}25import XCTest26import WebKit27@testable import CancelWKWebViewNavigation28class CancelWKWebViewNavigationTests: XCTestCase {29 override func setUp() {30 super.setUp()31 delegate = CancellingWKWebViewNavigationDelegate()32 webView = WKWebView(frame: CGRect.zero, configuration: WKWebViewConfiguration())33 }34 override func tearDown() {35 super.tearDown()36 }37 func testMultipleSnapshots() {38 let expectation = self.expectation(description: "Wait for web view to load")39 webView.load(URLRequest(url: url))40 waitForExpectations(timeout: 10, handler: nil)41 let snapshot1 = webView.snapshot()42 let snapshot2 = webView.snapshot()43 let snapshot3 = webView.snapshot()44 XCTAssertNotNil(snapshot1)45 XCTAssertNotNil(snapshot2)46 XCTAssertNotNil(snapshot3)47 }48}49import XCTest50import WebKit

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3@testable import App4class AppTests: XCTestCase {5 func testMultipleSnapshots() {6 let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 375, height: 1000))7 let delegate = CancellingWKWebViewNavigationDelegate()8 delegate.testMultipleSnapshots(webView: webView, test: self)9 }10}11import XCTest12import WebKit13import SnapshotTesting14class CancellingWKWebViewNavigationDelegate: NSObject, WKNavigationDelegate {15 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {16 webView.evaluateJavaScript("document.body.offsetHeight") { (height, error) in17 guard let height = height as? CGFloat else { return }18 assertSnapshot(matching: webView, as: .image)19 }20 }21 func testMultipleSnapshots(webView: WKWebView, test: XCTestCase) {22 let expectation = test.expectation(description: "Waiting for web view to load")23 test.waitForExpectations(timeout: 5, handler: nil)24 }25}

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3import SnapshotTesting4class MyUITests: XCTestCase {5 let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))6 let delegate = CancellingWKWebViewNavigationDelegate()7 override func setUp() {8 super.setUp()9 }10 func testLoadGoogle() {11 let expectation = self.expectation(description: "Load Google.com")12 delegate.navigationFinished = {13 expectation.fulfill()14 }15 webView.load(URLRequest(url: url))16 waitForExpectations(timeout: 10, handler: nil)17 assertSnapshot(matching: webView, as: .image)18 }19}20import XCTest21import WebKit22import SnapshotTesting23class MyUITests: XCTestCase {24 let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))25 let delegate = CancellingWKWebViewNavigationDelegate()26 override func setUp() {27 super.setUp()28 }29 func testLoadGoogle() {30 let expectation = self.expectation(description: "Load Google.com")31 delegate.navigationFinished = {32 expectation.fulfill()33 }34 webView.load(URLRequest(url: url))35 waitForExpectations(timeout: 10, handler: nil)36 testMultipleSnapshots(of: webView, as: .image)37 }38}39import XCTest40import WebKit41import SnapshotTesting42class MyUITests: XCTestCase {43 let webView = WKWebView(frame: CGRect(x: 0, y: 0, width: 300, height: 300))44 let delegate = CancellingWKWebViewNavigationDelegate()45 override func setUp() {46 super.setUp()

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3class MyTest: XCTestCase {4 override func setUp() {5 super.setUp()6 webView = WKWebView()7 delegate = CancellingWKWebViewNavigationDelegate(webView: webView)8 }9 override func tearDown() {10 super.tearDown()11 }12 func testMultipleSnapshots() {13 let expectation = self.expectation(description: "Finished loading")14 webView.load(URLRequest(url: url!))15 waitForExpectations(timeout: 10, handler: nil)16 let snapshot = webView.snapshot()17 let snapshot2 = webView.snapshot()18 let snapshot3 = webView.snapshot()19 let snapshot4 = webView.snapshot()20 let snapshot5 = webView.snapshot()21 let snapshot6 = webView.snapshot()22 let snapshot7 = webView.snapshot()23 let snapshot8 = webView.snapshot()24 let snapshot9 = webView.snapshot()25 let snapshot10 = webView.snapshot()26 assertSnapshot(matching: snapshot, as: .image)27 assertSnapshot(matching: snapshot2, as: .image)28 assertSnapshot(matching: snapshot3, as: .image)29 assertSnapshot(matching: snapshot4, as: .image)30 assertSnapshot(matching: snapshot5, as: .image)31 assertSnapshot(matching: snapshot6, as: .image)32 assertSnapshot(matching: snapshot7, as: .image)33 assertSnapshot(matching: snapshot8, as: .image)34 assertSnapshot(matching: snapshot9, as: .image)35 assertSnapshot(matching: snapshot10, as: .image)36 }37}38import XCTest39import WebKit40class MyTest: XCTestCase {41 override func setUp() {42 super.setUp()43 webView = WKWebView()44 delegate = CancellingWKWebViewNavigationDelegate(webView: webView)45 }

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3import SnapshotTesting4@testable import MyProject5class MyTest: XCTestCase {6 func testExample() {7 let webView = WKWebView()8 let delegate = CancellingWKWebViewNavigationDelegate()9 webView.load(URLRequest(url: url))10 delegate.testMultipleSnapshots(of: webView, timeout: 5, named: "testExample")11 }12}13import XCTest14import WebKit15import SnapshotTesting16@testable import MyProject17class MyTest: XCTestCase {18 func testExample() {19 let webView = WKWebView()20 let delegate = CancellingWKWebViewNavigationDelegate()21 webView.load(URLRequest(url: url))22 delegate.testMultipleSnapshots(of: webView, timeout: 5, named: "testExample")23 }24}25import XCTest26import WebKit27import SnapshotTesting28@testable import MyProject29class MyTest: XCTestCase {30 func testExample() {31 let webView = WKWebView()32 let delegate = CancellingWKWebViewNavigationDelegate()33 webView.load(URLRequest(url: url))34 delegate.testMultipleSnapshots(of: webView, timeout: 5, named: "testExample")35 }36}37import XCTest38import WebKit39import SnapshotTesting40@testable import MyProject41class MyTest: XCTestCase {42 func testExample() {43 let webView = WKWebView()44 let delegate = CancellingWKWebViewNavigationDelegate()45 webView.load(URLRequest(url: url))46 delegate.testMultipleSnapshots(of: webView, timeout: 5, named: "testExample")47 }

Full Screen

Full Screen

testMultipleSnapshots

Using AI Code Generation

copy

Full Screen

1import XCTest2import WebKit3@testable import WebKitSnapshotTests4class WebKitSnapshotTests: XCTestCase {5 override func setUp() {6 super.setUp()7 let configuration = WKWebViewConfiguration()8 configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent()9 webView = WKWebView(frame: .zero, configuration: configuration)10 }11 override func tearDown() {12 super.tearDown()13 }14 func testMultipleSnapshots() {15 let delegate = CancellingWKWebViewNavigationDelegate()16 let expectation = self.expectation(description: "Load a web page")17 delegate.onPageLoaded = {18 expectation.fulfill()19 }20 webView.load(URLRequest(url: url))21 waitForExpectations(timeout: 10, handler: nil)22 let snapshot = webView.snapshot()23 let snapshot2 = webView.snapshot()24 XCTAssertNotNil(snapshot)25 XCTAssertNotNil(snapshot2)26 }27}28import XCTest29import WebKit30@testable import WebKitSnapshotTests31class CancellingWKWebViewNavigationDelegate: NSObject, WKNavigationDelegate {32 var onPageLoaded: (() -> Void)?33 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {34 webView.stopLoading()35 onPageLoaded?()36 }37 func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {38 onPageLoaded?()39 }40}41import XCTest42import WebKit43@testable import WebKitSnapshotTests44class WebKitSnapshotTests: XCTestCase {45 override func setUp() {46 super.setUp()47 let configuration = WKWebViewConfiguration()48 configuration.websiteDataStore = WKWebsiteDataStore.nonPersistent()49 webView = WKWebView(frame: .zero, configuration: configuration)50 }51 override func tearDown() {52 super.tearDown()53 }

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful