diff --git a/tests/data/pyside/app.cgx b/tests/data/pyside/app.cgx
index c8b2318..101aa76 100644
--- a/tests/data/pyside/app.cgx
+++ b/tests/data/pyside/app.cgx
@@ -1,79 +1,77 @@
-
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
diff --git a/tests/pyside/test_pyside_elements.py b/tests/pyside/test_pyside_elements.py
index 7b14c69..011ea59 100644
--- a/tests/pyside/test_pyside_elements.py
+++ b/tests/pyside/test_pyside_elements.py
@@ -1,4 +1,3 @@
-import textwrap
from functools import partial
import pytest
@@ -8,10 +7,7 @@
from PySide6 import QtCore, QtGui, QtWidgets
-from collagraph import Collagraph
-from collagraph import create_element as h
-from collagraph.cgx.cgx import load_from_string
-from collagraph.renderers import PySideRenderer
+import collagraph as cg
def get_current_window(app):
@@ -25,16 +21,24 @@ def get_current_window(app):
return windows[0] if windows else None
-def test_simple_structure(qtbot):
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
+def test_simple_structure(qtbot, parse_source):
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
container = renderer.create_element("Window")
- def Simple(props):
- return h("Widget", {"object_name": "simple"})
+ Simple, _ = parse_source(
+ """
+
+
+ """
+ )
- gui.render(h(Simple, {}), container)
+ gui.render(Simple, container)
def check_simple_is_child():
simple = container.findChild(QtWidgets.QWidget, name="simple")
@@ -44,92 +48,92 @@ def check_simple_is_child():
qtbot.waitUntil(check_simple_is_child, timeout=500)
-def test_layouts(qapp, qtbot):
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
-
- def LayoutExample(props):
- # Data to fill the box layout
- box = []
- for i in range(1, 5):
- box.append(("Button", {"text": f"Button {i}"}))
-
- # Data to fill the grid layout
- grid = []
- for i in range(1, 5):
- grid.append(("Label", {"text": f"Line {i}", "grid_index": (i, 0)}))
- grid.append(("LineEdit", {"grid_index": (i, 1)}))
- grid.append(
- (
- "TextEdit",
- {
- "text": "This widget takes up about two thirds of the grid layout",
- "grid_index": (1, 2, 4, 1),
- },
- )
- )
-
- # Data to fill the form layout
- form = []
- for i, widget in enumerate(["LineEdit", "ComboBox", "SpinBox"]):
- text = f"Line {i+1}:"
- if i == 1:
- text = "Line 2, long text:"
- form.append((widget, {"form_label": text, "form_index": i}))
-
- return h(
- "Window",
- {},
- h(
- "Widget",
- {},
- h(
- "GroupBox",
- {
- "title": "Horizontal layout",
- "object_name": "box",
- "layout": {
- "type": "Box",
- "direction": "LeftToRight",
+def test_layouts(qapp, qtbot, parse_source):
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
+
+ LayoutExample, _ = parse_source(
+ """
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """
+ )
+
+ gui.render(LayoutExample, qapp)
window = None
@@ -155,64 +159,70 @@ def check_label():
qtbot.waitUntil(check_label, timeout=500)
-def test_lists(qapp, qtbot, qtmodeltester):
- def ListsExample(props):
- def add_item():
- props["items"].append([["NEW", "ITEM"], False])
-
- def remove_item():
- if len(props["items"]):
- props["items"].pop(0)
-
- children = []
- for row, (item, _) in enumerate(props["items"]):
- for column, text in enumerate(item):
- children.append(
- h("QStandardItem", {"text": text, "model_index": (row, column)})
- )
+def test_lists(qapp, qtbot, qtmodeltester, parse_source):
+ """
+ children = []
+ for row, (item, _) in enumerate(props["items"]):
+ for column, text in enumerate(item):
+ children.append(
+ h("QStandardItem", {"text": text, "model_index": (row, column)})
+ )
- item_model = h("QStandardItemModel", {"column_count": 2}, *children)
-
- return h(
- "Window",
- {},
- h(
- "Widget",
- {},
- h(
- "QSplitter",
- {},
- h("QListView", {}, item_model),
- h("QTableView", {}, item_model),
- h("QTreeView", {}, item_model),
- ),
- h(
- "Widget",
- {
- "layout": {
- "type": "Box",
- "direction": "LeftToRight",
- },
- "maximum-height": 50,
- },
- h(
- "Button",
- {"text": "Add", "on_clicked": add_item, "object_name": "add"},
- ),
- h(
- "Button",
- {
- "text": "Remove",
- "on_clicked": remove_item,
- "object_name": "remove",
- },
- ),
- ),
- ),
- )
+ item_model = h("QStandardItemModel", {"column_count": 2}, *children)
+ """
+ ListsExample, _ = parse_source(
+ """
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ """
+ )
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
state = reactive(
{
@@ -224,8 +234,7 @@ def remove_item():
assert len(qapp.topLevelWidgets()) == 0
- element = h(ListsExample, state)
- gui.render(element, qapp)
+ gui.render(ListsExample, qapp, state=state)
window = None
model = None
@@ -284,32 +293,31 @@ def check_model_does_not_contain_foo():
qtbot.waitUntil(check_model_does_not_contain_foo, timeout=500)
-def test_menu(qapp, qtbot):
- def MenuExample(props):
- return h(
- "Window",
- {},
- h(
- "QMenuBar",
- {},
- h(
- "QMenu",
- {"title": "File"},
- h(
- "QAction",
- {"text": "Open"},
- ),
- ),
- ),
- h(
- "Widget",
- {},
- ),
- )
-
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
- gui.render(h(MenuExample, {}), qapp)
+def test_menu(qapp, qtbot, parse_source):
+ MenuExample, _ = parse_source(
+ """
+
+
+
+
+
+
+
+
+
+
+
+ """
+ )
+
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
+ gui.render(MenuExample, qapp)
def check_file_menu():
windows = [
@@ -324,8 +332,51 @@ def check_file_menu():
qtbot.waitUntil(check_file_menu, timeout=500)
-def test_menu_extensively(qapp, qtbot):
- from tests.data.menubar import MenuBarTest
+@pytest.mark.skip("Segfaults")
+def test_menu_extensively(qapp, qtbot, parse_source):
+ MenuBarTest, _ = parse_source(
+ """
+
+
+
+
+
+
+
+
+
+ """
+ )
state = reactive(
{
@@ -336,9 +387,9 @@ def test_menu_extensively(qapp, qtbot):
"show_subitem": True,
}
)
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
- gui.render(h(MenuBarTest, state), qapp)
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
+ gui.render(MenuBarTest, qapp, state=state)
def check(menubar, menu, item, submenu, subitem):
windows = [
@@ -367,6 +418,7 @@ def check(menubar, menu, item, submenu, subitem):
state["show_menu"] = False
+ # breakpoint()
check_items = partial(check, True, False, False, False, False)
qtbot.waitUntil(check_items, timeout=500)
@@ -378,11 +430,11 @@ def check(menubar, menu, item, submenu, subitem):
def test_app(qapp, qtbot):
- from tests.data.app import Window
+ from tests.data.pyside.app import Window
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
- gui.render(h(Window), qapp)
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
+ gui.render(Window, qapp)
window = None
@@ -407,6 +459,7 @@ def check_name(type, name, show):
timeout=500,
)
dock = window.findChild(QtGui.QAction, "toggle_dock_title")
+ print(dock)
dock.triggered.emit()
qtbot.waitUntil(
@@ -479,36 +532,32 @@ def check_name(type, name, show):
)
-def test_scroll_area(qapp, qtbot):
- App, _ = load_from_string(
- textwrap.dedent(
- """
-
-
-
-
-
-
-
-
- """
- )
+def test_scroll_area(qapp, qtbot, parse_source):
+ App, _ = parse_source(
+ """
+
+
+
+
+
+
+ """
)
state = reactive({"label": True, "edit": True})
- renderer = PySideRenderer(autoshow=False)
- gui = Collagraph(renderer=renderer)
- gui.render(h(App, state), qapp)
+ renderer = cg.PySideRenderer(autoshow=False)
+ gui = cg.Collagraph(renderer=renderer)
+ gui.render(App, qapp, state=state)
scroll_area = None
diff --git a/tests/test_events.py b/tests/test_events.py
index a363b99..2b65ff8 100644
--- a/tests/test_events.py
+++ b/tests/test_events.py
@@ -1,8 +1,14 @@
-from collagraph import EventLoopType, Collagraph
+import pytest
+
+from collagraph import Collagraph, EventLoopType
from collagraph.renderers import DictRenderer
def test_reactive_element_with_events(parse_source):
+ """
+ Events can either be method names, or they have to be
+ proper expressions.
+ """
App, _ = parse_source(
"""
+
+
+ """
+ )
+
+ with pytest.raises(SyntaxError):
+ parse_source(
+ """
+
+
+
+ """
+ )
diff --git a/tests/test_sfc_comments.py b/tests/test_sfc_comments.py
index 3011c1a..ae3e521 100644
--- a/tests/test_sfc_comments.py
+++ b/tests/test_sfc_comments.py
@@ -1,13 +1,13 @@
import textwrap
-from collagraph.cgx import cgx
+from collagraph.sfc import compiler
def test_comment_at_root_level():
# This next call should not fail based
# on the existence of comments anywhere
# between the elements
- cgx.construct_ast(
+ compiler.construct_ast(
"template",
textwrap.dedent(
"""
diff --git a/tests/test_sfc_linting_support.py b/tests/test_sfc_linting_support.py
index 675a885..8148187 100644
--- a/tests/test_sfc_linting_support.py
+++ b/tests/test_sfc_linting_support.py
@@ -1,14 +1,13 @@
import ast
from pathlib import Path
-from collagraph.cgx import cgx
+from collagraph.sfc import compiler
-
-DATA_PATH = Path(__file__).parent.parent / "data"
+DATA_PATH = Path(__file__).parent / "data"
def test_cgx_construct_ast():
- tree, name = cgx.construct_ast(DATA_PATH / "simple.cgx")
+ tree, name = compiler.construct_ast(DATA_PATH / "simple.cgx")
assert name == "Simple"
assert isinstance(tree, ast.Module)