#![allow(dead_code)]
use std::cell::RefCell;
use std::sync::Mutex;
use qmetaobject::*;
lazy_static! {
pub static ref TEST_MUTEX: Mutex<()> = Mutex::new(());
pub static ref QML_LOGS: Mutex<Vec<String>> = Mutex::new(Vec::new());
}
pub fn lock_for_test() -> std::sync::MutexGuard<'static, ()> {
TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner())
}
extern "C" fn log_capture(msg_type: QtMsgType, context: &QMessageLogContext, message: &QString) {
let log = format!(
"{}:{} [{:?} {} {}] {}",
context.file(),
context.line(),
msg_type,
context.category(),
context.function(),
message
);
println!("{}", log);
let mut logs = QML_LOGS.lock().unwrap_or_else(|e| e.into_inner());
logs.push(log);
}
pub fn do_test<T: QObject + Sized>(obj: T, qml: &str) -> bool {
let _lock = lock_for_test();
QML_LOGS.lock().unwrap_or_else(|e| e.into_inner()).clear();
install_message_handler(Some(log_capture));
let qml_text = "import QtQuick 2.0\n".to_owned() + qml;
let obj = RefCell::new(obj);
let mut engine = QmlEngine::new();
engine.set_object_property("_obj".into(), unsafe { QObjectPinned::new(&obj) });
engine.load_data(qml_text.into());
engine.invoke_method("doTest".into(), &[]).to_bool()
}
pub fn do_test_error_with_url<T: QObject + Sized>(obj: T, qml: &str, url: &str) -> String {
let _lock = lock_for_test();
QML_LOGS.lock().unwrap_or_else(|e| e.into_inner()).clear();
install_message_handler(Some(log_capture));
let qml_text = "import QtQuick 2.0\n".to_owned() + qml;
let obj = RefCell::new(obj);
let mut engine = QmlEngine::new();
engine.set_object_property("_obj".into(), unsafe { QObjectPinned::new(&obj) });
engine.load_data_as(qml_text.into(), QString::from(url).into());
engine.invoke_method("doTest".into(), &[]);
let errors = QML_LOGS.lock().unwrap_or_else(|e| e.into_inner());
errors.last().expect("An error from QmlEngine was expected").clone()
}
pub fn do_test_variant(obj: QVariant, qml: &str) -> bool {
let _lock = lock_for_test();
QML_LOGS.lock().unwrap_or_else(|e| e.into_inner()).clear();
install_message_handler(Some(log_capture));
let qml_text = "import QtQuick 2.0\n".to_owned() + qml;
let mut engine = QmlEngine::new();
engine.set_property("_obj".into(), obj);
engine.load_data(qml_text.into());
engine.invoke_method("doTest".into(), &[]).to_bool()
}
pub fn test_loading_logs(qml: &str, log: &str) -> bool {
let _lock = TEST_MUTEX.lock().unwrap_or_else(|e| e.into_inner());
QML_LOGS.lock().unwrap_or_else(|e| e.into_inner()).clear();
install_message_handler(Some(log_capture));
let qml_text = "import QtQuick 2.0\n".to_owned() + qml;
let mut engine = QmlEngine::new();
engine.load_data(qml_text.into());
let logs = QML_LOGS.lock().unwrap_or_else(|e| e.into_inner());
logs.iter().any(|x| x.contains(log))
}