From b59683b9f93cb209e274b283f3ae964c899e8572 Mon Sep 17 00:00:00 2001 From: "Hedden, Kyle Matthew" Date: Tue, 16 Jul 2024 21:11:38 -0400 Subject: [PATCH] Adjustable delays and stress testing through replay. --- .../JSONCreator/DetailViewController.swift | 8 ++-- .../MoleculeReplacementViewController.swift | 43 ++++++++++++++++--- 2 files changed, 42 insertions(+), 9 deletions(-) diff --git a/JSONCreator_iOS/JSONCreator/DetailViewController.swift b/JSONCreator_iOS/JSONCreator/DetailViewController.swift index 1066566..1e65bad 100644 --- a/JSONCreator_iOS/JSONCreator/DetailViewController.swift +++ b/JSONCreator_iOS/JSONCreator/DetailViewController.swift @@ -129,11 +129,13 @@ class DetailViewController: UIViewController { @objc func update() { Task { @MainActor in let moleculeReplacementVC = MoleculeReplacementViewController() - moleculeReplacementVC.replaceCallback = { serverResponse, loadObject in + moleculeReplacementVC.replaceCallback = { [weak self] serverResponse, loadObject, delay, replay in Task { await NavigationHandler.shared().popTopViewController() - try? await Task.sleep(nanoseconds: 4000000) - await MVMCoreLoadRequestOperation.processJSON(fromServer: serverResponse, loadObject: loadObject) + repeat { + try? await Task.sleep(nanoseconds: UInt64(delay * 1_000_000_000)) + await MVMCoreLoadRequestOperation.processJSON(fromServer: serverResponse, loadObject: loadObject) + } while(replay && self != nil) } } await NavigationHandler.shared().push(viewController: moleculeReplacementVC) diff --git a/JSONCreator_iOS/JSONCreator/MoleculeReplacementViewController.swift b/JSONCreator_iOS/JSONCreator/MoleculeReplacementViewController.swift index cb86600..510d05e 100644 --- a/JSONCreator_iOS/JSONCreator/MoleculeReplacementViewController.swift +++ b/JSONCreator_iOS/JSONCreator/MoleculeReplacementViewController.swift @@ -12,8 +12,11 @@ import MVMCoreUI class MoleculeReplacementViewController: UIViewController { let textView = UITextView(frame: .zero) - var replaceCallback: (([AnyHashable : Any], MVMCoreLoadObject)->Void)? - + var replaceCallback: (([AnyHashable : Any], MVMCoreLoadObject, _ delay: TimeInterval, _ replay: Bool)->Void)? + + var applicationDelay = 3.0 + var replay = false + override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. @@ -61,6 +64,16 @@ class MoleculeReplacementViewController: UIViewController { let buildButton = UIBarButtonItem(barButtonSystemItem: .play, target: self, action: #selector(play)) navigationItem.setRightBarButtonItems([clearButton, buildButton], animated: true) navigationItem.title = "Trigger Update" + resetToolbarItems() + } + + func resetToolbarItems() { + if #available(iOS 16.0, *) { + let spacer = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: self, action: nil) + let delayButton = UIBarButtonItem(title: "\(applicationDelay)s", image: nil, target: self, action: #selector(delay)) + let replayButton = UIBarButtonItem(barButtonSystemItem: replay ? .refresh : .compose, target: self, action: #selector(toggleReplay)) + setToolbarItems([spacer, delayButton, replayButton], animated: true) + } } func showError(_ error: NSError) { @@ -84,17 +97,35 @@ class MoleculeReplacementViewController: UIViewController { let loadObject = MVMCoreLoadObject(pageJSON: nil, modulesJSON: modulesJSON, requestParameters: nil, dataForPage: nil, delegateObject: nil)! - replaceCallback?(rawServerResponse, loadObject) + replaceCallback?(rawServerResponse, loadObject, applicationDelay, replay) } } catch { showError(error as NSError) } } - @objc func close() { - Task { @MainActor in - await NavigationHandler.shared().popTopViewController() + @objc func delay() { + let alert = UIAlertController(title: "Delay", message: "Set delay", preferredStyle: .alert) + alert.addTextField { textField in + textField.text = "\(self.applicationDelay)" + textField.placeholder = "Delay in seconds" } + let action = UIAlertAction(title: "Confirm", style: .default) { [weak self] action in + guard let self = self, + let input = alert.textFields?.first?.text, + let value = Double(input) else { + return + } + self.applicationDelay = value + self.resetToolbarItems() + } + alert.addAction(action) + present(alert, animated: true) + } + + @objc func toggleReplay() { + replay = !replay + resetToolbarItems() } }