diff --git a/.appveyor.yml b/.appveyor.yml index a056da989d..73654cafef 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -7,6 +7,7 @@ skip_commits: - docs/**/* - media/**/* - "*.md" + - sdk/python/packages/flet/integration_tests/**/* environment: PYTHON_VERSION: 3.12 diff --git a/client/pubspec.lock b/client/pubspec.lock index a6032bd936..92afa451f2 100644 --- a/client/pubspec.lock +++ b/client/pubspec.lock @@ -996,10 +996,10 @@ packages: dependency: transitive description: name: process - sha256: c6248e4526673988586e8c00bb22a49210c258dc91df5227d5da9748ecf79744 + sha256: "107d8be718f120bbba9dcd1e95e3bd325b1b4a4f07db64154635ba03f2567a0d" url: "https://pub.dev" source: hosted - version: "5.0.5" + version: "5.0.3" proj4dart: dependency: transitive description: @@ -1465,10 +1465,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + sha256: ddfa8d30d89985b96407efce8acbdd124701f96741f2d981ca860662f1c0dc02 url: "https://pub.dev" source: hosted - version: "15.0.2" + version: "15.0.0" volume_controller: dependency: transitive description: diff --git a/sdk/python/examples/controls/cupertino_alert_dialog/cupertino_material_and_adaptive.py b/sdk/python/examples/controls/cupertino_alert_dialog/material_and_adaptive.py similarity index 100% rename from sdk/python/examples/controls/cupertino_alert_dialog/cupertino_material_and_adaptive.py rename to sdk/python/examples/controls/cupertino_alert_dialog/material_and_adaptive.py diff --git a/sdk/python/examples/controls/cupertino_checkbox/cupertino_material_and_adaptive.py b/sdk/python/examples/controls/cupertino_checkbox/material_and_adaptive.py similarity index 100% rename from sdk/python/examples/controls/cupertino_checkbox/cupertino_material_and_adaptive.py rename to sdk/python/examples/controls/cupertino_checkbox/material_and_adaptive.py diff --git a/sdk/python/examples/controls/cupertino_radio/basic.py b/sdk/python/examples/controls/cupertino_radio/basic.py new file mode 100644 index 0000000000..b89df0f928 --- /dev/null +++ b/sdk/python/examples/controls/cupertino_radio/basic.py @@ -0,0 +1,38 @@ +import flet as ft + + +def main(page: ft.Page): + def handle_button_click(e: ft.Event[ft.ElevatedButton]): + message.value = f"Your favorite color is: {group.value}" + page.update() + + page.add( + ft.Text("Select your favorite color:"), + group := ft.RadioGroup( + content=ft.Column( + controls=[ + ft.CupertinoRadio( + value="red", + label="Red", + active_color=ft.Colors.RED_200, + inactive_color=ft.Colors.RED_600, + ), + ft.CupertinoRadio( + value="green", + label="Green", + fill_color=ft.Colors.GREEN, + ), + ft.CupertinoRadio( + value="blue", + label="Blue", + active_color=ft.Colors.BLUE, + ), + ] + ) + ), + ft.ElevatedButton(content="Submit", on_click=handle_button_click), + message := ft.Text(), + ) + + +ft.run(main) diff --git a/sdk/python/examples/controls/cupertino_radio/cupertino_material_and_adaptive.py b/sdk/python/examples/controls/cupertino_radio/material_and_adaptive.py similarity index 100% rename from sdk/python/examples/controls/cupertino_radio/cupertino_material_and_adaptive.py rename to sdk/python/examples/controls/cupertino_radio/material_and_adaptive.py diff --git a/sdk/python/examples/controls/cupertino_switch/cupertino_material_and_adaptive.py b/sdk/python/examples/controls/cupertino_switch/material_and_adaptive.py similarity index 100% rename from sdk/python/examples/controls/cupertino_switch/cupertino_material_and_adaptive.py rename to sdk/python/examples/controls/cupertino_switch/material_and_adaptive.py diff --git a/sdk/python/examples/controls/cupertino_text_field/background_image.py b/sdk/python/examples/controls/cupertino_text_field/background_image.py new file mode 100644 index 0000000000..dbb1c1e965 --- /dev/null +++ b/sdk/python/examples/controls/cupertino_text_field/background_image.py @@ -0,0 +1,18 @@ +import flet as ft + + +async def main(page: ft.Page): + page.theme_mode = ft.ThemeMode.LIGHT + page.add( + ctf := ft.CupertinoTextField( + label="Textfield Label", + label_style=ft.TextStyle(italic=True, weight=ft.FontWeight.BOLD), + bgcolor=ft.Colors.BLUE_GREY, + image=ft.DecorationImage( + src_base64="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" + ), + ) + ) + + +ft.run(main) diff --git a/sdk/python/examples/controls/cupertino_text_field/label_focus.py b/sdk/python/examples/controls/cupertino_text_field/label_focus.py new file mode 100644 index 0000000000..7185848841 --- /dev/null +++ b/sdk/python/examples/controls/cupertino_text_field/label_focus.py @@ -0,0 +1,14 @@ +import flet as ft + + +async def main(page: ft.Page): + page.theme_mode = ft.ThemeMode.LIGHT + page.add( + ctf := ft.CupertinoTextField( + label="Textfield Label", + ) + ) + await ctf.focus() + + +ft.run(main) diff --git a/sdk/python/examples/controls/cupertino_text_field/cupertino_material_and_adaptive.py b/sdk/python/examples/controls/cupertino_text_field/material_and_adaptive.py similarity index 100% rename from sdk/python/examples/controls/cupertino_text_field/cupertino_material_and_adaptive.py rename to sdk/python/examples/controls/cupertino_text_field/material_and_adaptive.py diff --git a/sdk/python/examples/controls/text_field/styled.py b/sdk/python/examples/controls/text_field/styled.py index 3f3a3ba8aa..055408e962 100644 --- a/sdk/python/examples/controls/text_field/styled.py +++ b/sdk/python/examples/controls/text_field/styled.py @@ -1,11 +1,11 @@ import flet as ft -def main(page: ft.Page): +async def main(page: ft.Page): page.padding = 50 page.add( - ft.TextField( + tf := ft.TextField( text_size=30, cursor_color=ft.Colors.RED, selection_color=ft.Colors.YELLOW, @@ -21,6 +21,7 @@ def main(page: ft.Page): capitalization=ft.TextCapitalization.CHARACTERS, ) ) + await tf.focus() ft.run(main) diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_0.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_0.png new file mode 100644 index 0000000000..edbff0ced1 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_0.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_1.png new file mode 100644 index 0000000000..9a279101a4 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_checkbox/checkboxes_1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_blue.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_blue.png new file mode 100644 index 0000000000..0709da0a7d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_blue.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_red.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_red.png new file mode 100644 index 0000000000..cd3aca167a Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/basic_red.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/checkmark.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/checkmark.png new file mode 100644 index 0000000000..0fe574f6a0 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_radio/checkmark.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_middle.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_middle.png new file mode 100644 index 0000000000..0d6433875b Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_middle.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_start.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_start.png new file mode 100644 index 0000000000..89a5de395d Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_slider/slider_start.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_off.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_off.png new file mode 100644 index 0000000000..2651c2fd71 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_off.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_on.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_on.png new file mode 100644 index 0000000000..1624c2f6e2 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_switch/switch_on.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/basic.png new file mode 100644 index 0000000000..d938eec498 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/filled.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/filled.png new file mode 100644 index 0000000000..93b2b5c767 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/filled.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label.png new file mode 100644 index 0000000000..a73531f76f Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label_and_image.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label_and_image.png new file mode 100644 index 0000000000..15c428bb76 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/cupertino_textfield/label_and_image.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic1.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic1.png new file mode 100644 index 0000000000..6e0e0301e7 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic1.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic2.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic2.png new file mode 100644 index 0000000000..1697d1b634 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/markdown/basic2.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/progress_bar/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/progress_bar/basic.png new file mode 100644 index 0000000000..19fa57de26 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/progress_bar/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/one.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/one.png new file mode 100644 index 0000000000..043554110f Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/one.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/three.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/three.png new file mode 100644 index 0000000000..71bc16495e Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/three.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/two.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/two.png new file mode 100644 index 0000000000..f4906d8b14 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/radio/two.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/default.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/default.png new file mode 100644 index 0000000000..12decf05e0 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/default.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/slider_move.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/slider_move.png new file mode 100644 index 0000000000..12e75193da Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/slider_move.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/tap.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/tap.png new file mode 100644 index 0000000000..158091dbe3 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/range_slider/tap.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/basic.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/basic.png new file mode 100644 index 0000000000..ff33f19ef4 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/basic.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/range_and_label.png b/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/range_and_label.png new file mode 100644 index 0000000000..d16283a6e8 Binary files /dev/null and b/sdk/python/packages/flet/integration_tests/controls/golden/macos/slider/range_and_label.png differ diff --git a/sdk/python/packages/flet/integration_tests/controls/test_cupertino_checkbox.py b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_checkbox.py new file mode 100644 index 0000000000..602d571fd2 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_checkbox.py @@ -0,0 +1,64 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_styled_cupertino_checkboxes(flet_app: ftt.FletTestApp, request): + cbs = ft.Column( + controls=[ + ft.CupertinoCheckbox( + label="Cupertino Checkbox tristate", + value=True, + tristate=True, + check_color=ft.Colors.GREY_900, + fill_color={ + ft.ControlState.HOVERED: ft.Colors.PINK_200, + ft.ControlState.PRESSED: ft.Colors.LIME_ACCENT_200, + ft.ControlState.SELECTED: ft.Colors.DEEP_ORANGE_200, + ft.ControlState.DEFAULT: ft.Colors.TEAL_200, + }, + key="tristate", + ), + ft.CupertinoCheckbox( + label="Cupertino Checkbox circle border", + value=True, + shape=ft.CircleBorder(), + key="circleborder", + ), + ft.CupertinoCheckbox( + label="Cupertino Checkbox label position", + value=True, + label_position=ft.LabelPosition.LEFT, + key="labelposition", + ), + ] + ) + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [cbs] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # normal state + flet_app.assert_screenshot( + "checkboxes_0", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # checked state + await flet_app.tester.tap(await flet_app.tester.find_by_key("tristate")) + await flet_app.tester.tap(await flet_app.tester.find_by_key("circleborder")) + await flet_app.tester.tap(await flet_app.tester.find_by_key("labelposition")) + + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "checkboxes_1", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_cupertino_radio.py b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_radio.py new file mode 100644 index 0000000000..48af9020bb --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_radio.py @@ -0,0 +1,58 @@ +import pytest + +import flet as ft +import flet.testing as ftt + +rs: list[ft.CupertinoRadio] = [ + ft.CupertinoRadio( + value="red", + label="Red", + active_color=ft.Colors.RED_600, + inactive_color=ft.Colors.RED_200, + key="red", + ), + ft.CupertinoRadio( + value="green", + label="Green", + fill_color=ft.Colors.GREEN, + key="green", + ), + ft.CupertinoRadio( + value="blue", + label="Blue", + active_color=ft.Colors.BLUE, + key="blue", + ), +] + +rg = ft.RadioGroup( + content=ft.Column( + controls=rs, + ), + value="red", +) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic_red(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot(request.node.name, rg) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic_blue(flet_app: ftt.FletTestApp, request): + rg.value = "blue" + await flet_app.assert_control_screenshot( + request.node.name, + rg, + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_checkmark(flet_app: ftt.FletTestApp, request): + for c in rs: + c.use_checkmark_style = True + rg.update() + await flet_app.assert_control_screenshot( + request.node.name, + rg, + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_cupertino_slider.py b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_slider.py new file mode 100644 index 0000000000..0820e266db --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_slider.py @@ -0,0 +1,40 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_cupertino_slider(flet_app: ftt.FletTestApp, request): + sl = ft.CupertinoSlider( + divisions=20, + min=0, + max=100, + active_color=ft.Colors.PURPLE, + thumb_color=ft.Colors.PURPLE, + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [sl] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "slider_start", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + sl.value = 50.0 + flet_app.page.update() + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "slider_middle", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_cupertino_switch.py b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_switch.py new file mode 100644 index 0000000000..61a4db28e4 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_switch.py @@ -0,0 +1,37 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_cupertino_switch(flet_app: ftt.FletTestApp, request): + sw = ft.CupertinoSwitch( + label="Cupertino Switch", + value=True, + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [sw] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "switch_on", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + sw.value = False + await flet_app.tester.pump_and_settle() + flet_app.page.update() + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "switch_off", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_cupertino_textfield.py b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_textfield.py new file mode 100644 index 0000000000..beba65a686 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_cupertino_textfield.py @@ -0,0 +1,58 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.CupertinoTextField( + placeholder_text="Cupertino text field", + placeholder_style=ft.TextStyle(color=ft.Colors.GREY_400), + margin=25, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_filled(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.CupertinoTextField( + placeholder_text="Cupertino text field", + placeholder_style=ft.TextStyle(color=ft.Colors.GREY_400), + value="Testing Textfield 1,2,3!", + margin=25, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_label(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.CupertinoTextField( + label="Textfield Label", + label_style=ft.TextStyle(italic=True, weight=ft.FontWeight.BOLD), + margin=25, + ), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_label_and_image(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.CupertinoTextField( + label="Textfield Label", + label_style=ft.TextStyle(italic=True, weight=ft.FontWeight.BOLD), + bgcolor=ft.Colors.BLUE_GREY, + image=ft.DecorationImage( + src_base64="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" + ), + ), + pump_duration=ft.Duration.from_unit(seconds=4), + pump_times=1, + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_markdown.py b/sdk/python/packages/flet/integration_tests/controls/test_markdown.py new file mode 100644 index 0000000000..03f06cc3f3 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_markdown.py @@ -0,0 +1,119 @@ +import pytest +import asyncio +import flet as ft +import flet.testing as ftt + + +sample1 = """ +# Markdown Example +Markdown allows you to easily include formatted text, images, and even formatted Dart +code in your app. + +## Titles + +Setext-style + +This is an H1 +============= + +This is an H2 +------------- + +Atx-style + +# This is an H1 + +## This is an H2 + +###### This is an H6 + +Select the valid headers: + +- [x] `# hello` +- [ ] `#hello` + +## Links + +[inline-style](https://www.google.com) + +## Styling + +Style text as _italic_, __bold__, ~~strikethrough~~, or `inline code`. + +- Use bulleted lists +- To better clarify +- Your points + + +""" + +sample2 = """ +## Tables + +|Syntax |Result | +|---------------------------------------|-------------------------------------| +|`*italic 1*` |*italic 1* | +|`_italic 2_` | _italic 2_ | +|`**bold 1**` |**bold 1** | +|`__bold 2__` |__bold 2__ | +|`This is a ~~strikethrough~~` |This is a ~~strikethrough~~ | +|`***italic bold 1***` |***italic bold 1*** | +|`___italic bold 2___` |___italic bold 2___ | +|`***~~italic bold strikethrough 1~~***`|***~~italic bold strikethrough 1~~***| +|`~~***italic bold strikethrough 2***~~`|~~***italic bold strikethrough 2***~~| + + +## Code blocks + +Formatted Dart code looks really pretty too: + +``` +void main() { + runApp(MaterialApp( + home: Scaffold( + body: ft.Markdown(data: markdownData), + ), + )); +} +``` +""" + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic(flet_app: ftt.FletTestApp, request): + + md1 = ft.Markdown( + value=sample1, + selectable=True, + extension_set=ft.MarkdownExtensionSet.GITHUB_WEB, + ) + md2 = ft.Markdown( + value=sample2, + selectable=True, + extension_set=ft.MarkdownExtensionSet.GITHUB_WEB, + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 800 + flet_app.page.controls = [md1] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "basic1", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + flet_app.page.controls = [md2] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + flet_app.assert_screenshot( + "basic2", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_progress_bar.py b/sdk/python/packages/flet/integration_tests/controls/test_progress_bar.py new file mode 100644 index 0000000000..c5f87fdee7 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_progress_bar.py @@ -0,0 +1,14 @@ +import pytest +import asyncio +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.ProgressBar( + width=400, color=ft.Colors.GREEN_400, bgcolor=ft.Colors.GREY_400, value=None + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_radio.py b/sdk/python/packages/flet/integration_tests/controls/test_radio.py new file mode 100644 index 0000000000..201d62b5f8 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_radio.py @@ -0,0 +1,54 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_radio(flet_app: ftt.FletTestApp, request): + group = ft.RadioGroup( + content=ft.Column( + controls=[ + ft.Radio(value="one", label="One"), + ft.Radio(value="two", label="Two"), + ft.Radio(value="three", label="Three"), + ] + ) + ) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [group] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # one chosen + await flet_app.tester.tap(await flet_app.tester.find_by_text("One")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "one", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # two chosen + await flet_app.tester.tap(await flet_app.tester.find_by_text("Two")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "two", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # three chosen + await flet_app.tester.tap(await flet_app.tester.find_by_text("Three")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "three", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_range_slider.py b/sdk/python/packages/flet/integration_tests/controls/test_range_slider.py new file mode 100644 index 0000000000..4a10d86941 --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_range_slider.py @@ -0,0 +1,58 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_range_slider(flet_app: ftt.FletTestApp, request): + rs = ft.RangeSlider( + min=0, + max=50, + start_value=0, + divisions=10, + end_value=50, + inactive_color=ft.Colors.GREEN_300, + active_color=ft.Colors.GREEN_700, + overlay_color=ft.Colors.GREEN_100, + label="{value}%", + key="rs", + ) + c = ft.Container(content=rs, padding=ft.Padding.only(top=40)) + + flet_app.page.enable_screenshots = True + flet_app.page.window.width = 400 + flet_app.page.window.height = 600 + flet_app.page.controls = [c] + flet_app.page.update() + await flet_app.tester.pump_and_settle() + + # default + flet_app.assert_screenshot( + "default", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # move slider + rs.end_value = 20 + rs.start_value = 10 + flet_app.page.update() + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "slider_move", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) + + # tap + await flet_app.tester.tap(await flet_app.tester.find_by_key("rs")) + await flet_app.tester.pump_and_settle() + flet_app.assert_screenshot( + "tap", + await flet_app.page.take_screenshot( + pixel_ratio=flet_app.screenshots_pixel_ratio + ), + ) diff --git a/sdk/python/packages/flet/integration_tests/controls/test_slider.py b/sdk/python/packages/flet/integration_tests/controls/test_slider.py new file mode 100644 index 0000000000..209d83955a --- /dev/null +++ b/sdk/python/packages/flet/integration_tests/controls/test_slider.py @@ -0,0 +1,20 @@ +import pytest + +import flet as ft +import flet.testing as ftt + + +@pytest.mark.asyncio(loop_scope="module") +async def test_basic(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.Slider(value=0.3), + ) + + +@pytest.mark.asyncio(loop_scope="module") +async def test_range_and_label(flet_app: ftt.FletTestApp, request): + await flet_app.assert_control_screenshot( + request.node.name, + ft.Slider(min=0, max=100, divisions=10, label="{value}%"), + )