diff options
Diffstat (limited to 'third_party/rust/uniffi-example-todolist/tests')
5 files changed, 249 insertions, 0 deletions
diff --git a/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.kts b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.kts new file mode 100644 index 0000000000..bb2b292224 --- /dev/null +++ b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.kts @@ -0,0 +1,83 @@ +import uniffi.todolist.* + +val todo = TodoList() + +// This throws an exception: +try { + todo.getLast() + throw RuntimeException("Should have thrown a TodoError!") +} catch (e: TodoException.EmptyTodoList) { + // It's okay, we don't have any items yet! +} + +try { + createEntryWith("") + throw RuntimeException("Should have thrown a TodoError!") +} catch (e: TodoException) { + // It's okay, the string was empty! + assert(e is TodoException.EmptyString) + assert(e !is TodoException.EmptyTodoList) +} + +todo.addItem("Write strings support") + +assert(todo.getLast() == "Write strings support") + +todo.addItem("Write tests for strings support") + +assert(todo.getLast() == "Write tests for strings support") + +val entry = createEntryWith("Write bindings for strings as record members") + +todo.addEntry(entry) +assert(todo.getLast() == "Write bindings for strings as record members") +assert(todo.getLastEntry().text == "Write bindings for strings as record members") + +todo.addItem("Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") +assert(todo.getLast() == "Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") + +val entry2 = TodoEntry("Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") +todo.addEntry(entry2) +assert(todo.getLastEntry().text == "Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") + +assert(todo.getEntries().size == 5) + +todo.addEntries(listOf(TodoEntry("foo"), TodoEntry("bar"))) +assert(todo.getEntries().size == 7) +assert(todo.getLastEntry().text == "bar") + +todo.addItems(listOf("bobo", "fofo")) +assert(todo.getItems().size == 9) +assert(todo.getItems()[7] == "bobo") + +assert(getDefaultList() == null) + +// Note that each individual object instance needs to be explicitly destroyed, +// either by using the `.use` helper or explicitly calling its `.destroy` method. +// Failure to do so will leak the underlying Rust object. +TodoList().use { todo2 -> + setDefaultList(todo) + getDefaultList()!!.use { default -> + assert(todo.getEntries() == default.getEntries()) + assert(todo2.getEntries() != default.getEntries()) + } + + todo2.makeDefault() + getDefaultList()!!.use { default -> + assert(todo.getEntries() != default.getEntries()) + assert(todo2.getEntries() == default.getEntries()) + } + + todo.addItem("Test liveness after being demoted from default") + assert(todo.getLast() == "Test liveness after being demoted from default") + + todo2.addItem("Test shared state through local vs default reference") + getDefaultList()!!.use { default -> + assert(default.getLast() == "Test shared state through local vs default reference") + } +} + +// Ensure the kotlin version of deinit doesn't crash, and is idempotent. +todo.destroy() +todo.destroy() + diff --git a/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.py b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.py new file mode 100644 index 0000000000..017e999fb2 --- /dev/null +++ b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.py @@ -0,0 +1,44 @@ +from todolist import * + +todo = TodoList() + +entry = TodoEntry("Write bindings for strings in records") + +todo.add_item("Write python bindings") + +assert(todo.get_last() == "Write python bindings") + +todo.add_item("Write tests for bindings") + +assert(todo.get_last() == "Write tests for bindings") + +todo.add_entry(entry) + +assert(todo.get_last() == "Write bindings for strings in records") +assert(todo.get_last_entry().text == "Write bindings for strings in records") + +todo.add_item("Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") +assert(todo.get_last() == "Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") + +entry2 = TodoEntry("Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") +todo.add_entry(entry2) +assert(todo.get_last_entry().text == "Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") + +todo2 = TodoList() +assert(todo != todo2) +assert(todo is not todo2) + +assert(get_default_list() is None) + +set_default_list(todo) +assert(todo.get_items() == get_default_list().get_items()) + +todo2.make_default() +assert(todo2.get_items() == get_default_list().get_items()) + +todo.add_item("Test liveness after being demoted from default") +assert(todo.get_last() == "Test liveness after being demoted from default") + +todo2.add_item("Test shared state through local vs default reference") +assert(get_default_list().get_last() == "Test shared state through local vs default reference") + diff --git a/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.rb b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.rb new file mode 100644 index 0000000000..d9e04f92e7 --- /dev/null +++ b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.rb @@ -0,0 +1,47 @@ +# frozen_string_literal: true + +require 'test/unit' +require 'todolist' + +include Test::Unit::Assertions +include Todolist + +todo = TodoList.new +entry = TodoEntry.new 'Write bindings for strings in records' + +todo.add_item('Write ruby bindings') + +assert_equal todo.get_last, 'Write ruby bindings' + +todo.add_item('Write tests for bindings') + +assert_equal todo.get_last, 'Write tests for bindings' + +todo.add_entry(entry) + +assert_equal todo.get_last, 'Write bindings for strings in records' +assert_equal todo.get_last_entry.text, 'Write bindings for strings in records' + +todo.add_item("Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") +assert_equal todo.get_last, "Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣" + +entry2 = TodoEntry.new("Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") +todo.add_entry(entry2) +assert_equal todo.get_last_entry.text, "Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣" + +todo2 = TodoList.new +assert todo2.get_items != todo.get_items + +assert Todolist.get_default_list == nil + +Todolist.set_default_list todo +assert todo.get_items == Todolist.get_default_list.get_items + +todo2.make_default +assert todo2.get_items == Todolist.get_default_list.get_items + +todo.add_item "Test liveness after being demoted from default" +assert todo.get_last == "Test liveness after being demoted from default" + +todo2.add_item "Test shared state through local vs default reference" +assert Todolist.get_default_list.get_last == "Test shared state through local vs default reference"
\ No newline at end of file diff --git a/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.swift b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.swift new file mode 100644 index 0000000000..6ce72cadb2 --- /dev/null +++ b/third_party/rust/uniffi-example-todolist/tests/bindings/test_todolist.swift @@ -0,0 +1,69 @@ +import todolist + + +let todo = TodoList() +do { + let _ = try todo.getLast() + fatalError("Should have thrown an EmptyTodoList error!") +} catch TodoError.EmptyTodoList{ + //It's okay! There are not todos! +} +try! todo.addItem(todo: "Write swift bindings") +assert( try! todo.getLast() == "Write swift bindings") + +try! todo.addItem(todo: "Write tests for bindings") +assert(try! todo.getLast() == "Write tests for bindings") + +let entry = TodoEntry(text: "Write bindings for strings as record members") +try! todo.addEntry(entry: entry) +assert(try! todo.getLast() == "Write bindings for strings as record members") + +try! todo.addItem(todo: "Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") +assert(try! todo.getLast() == "Test Ünicode hàndling without an entry can't believe I didn't test this at first 🤣") + +do { + let _ = try createEntryWith(todo: "") + fatalError("Should have thrown an EmptyString error!") +} catch TodoError.EmptyString { + // It's okay! It was an empty string +} + +let entry2 = TodoEntry(text: "Test Ünicode hàndling in an entry can't believe I didn't test this at first 🤣") +try! todo.addEntry(entry: entry2) +assert(try! todo.getLastEntry() == entry2) + +assert(todo.getEntries().count == 5) + +todo.addEntries(entries: [TodoEntry(text: "foo"), TodoEntry(text: "bar")]) +assert(todo.getEntries().count == 7) +assert(todo.getItems().count == 7) +assert(try! todo.getLast() == "bar") + +todo.addItems(items: ["bobo", "fofo"]) +assert(todo.getItems().count == 9) +assert(todo.getItems()[7] == "bobo") + +// Ensure deinit doesn't crash. +for _ in 0..<10 { + let list = TodoList() + try! list.addItem(todo: "todo") +} + +let todo2 = TodoList() + +assert(getDefaultList() == nil) + +setDefaultList(list: todo) +assert(todo.getItems() == getDefaultList()!.getItems()) +assert(todo2.getItems() != getDefaultList()!.getItems()) + +todo2.makeDefault() +assert(todo.getItems() != getDefaultList()!.getItems()) +assert(todo2.getItems() == getDefaultList()!.getItems()) + +try! todo.addItem(todo: "Test liveness after being demoted from default") +assert(try! todo.getLast() == "Test liveness after being demoted from default") + +try! todo2.addItem(todo: "Test shared state through local vs default reference") +assert(try! getDefaultList()!.getLast() == "Test shared state through local vs default reference") + diff --git a/third_party/rust/uniffi-example-todolist/tests/test_generated_bindings.rs b/third_party/rust/uniffi-example-todolist/tests/test_generated_bindings.rs new file mode 100644 index 0000000000..cefdbfe1dc --- /dev/null +++ b/third_party/rust/uniffi-example-todolist/tests/test_generated_bindings.rs @@ -0,0 +1,6 @@ +uniffi::build_foreign_language_testcases!( + "tests/bindings/test_todolist.kts", + "tests/bindings/test_todolist.swift", + "tests/bindings/test_todolist.rb", + "tests/bindings/test_todolist.py" +); |