You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
194 lines
6.5 KiB
194 lines
6.5 KiB
# MIT License |
|
# |
|
# Copyright (c) 2026 Eugenio Parodi <ceccopierangiolieugenio AT googlemail DOT com> |
|
# |
|
# Permission is hereby granted, free of charge, to any person obtaining a copy |
|
# of this software and associated documentation files (the "Software"), to deal |
|
# in the Software without restriction, including without limitation the rights |
|
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|
# copies of the Software, and to permit persons to whom the Software is |
|
# furnished to do so, subject to the following conditions: |
|
# |
|
# The above copyright notice and this permission notice shall be included in all |
|
# copies or substantial portions of the Software. |
|
# |
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
# SOFTWARE. |
|
|
|
import pytest |
|
import sys |
|
import os |
|
|
|
sys.path.insert(0, os.path.join(os.path.dirname(__file__), '../../../libs/pyTermTk')) |
|
|
|
import TermTk as ttk |
|
from ttkode.helper import TTkodeHelper |
|
from ttkode.plugin import TTkodePlugin, TTkodePluginWidgetActivity, TTkodePluginWidgetPanel |
|
|
|
|
|
class TestTTkodeHelper: |
|
"""Test the helper functions for plugin management.""" |
|
|
|
def test_get_plugins_empty(self): |
|
"""Test getting plugins when none are loaded.""" |
|
# Clear existing plugins |
|
TTkodePlugin.instances.clear() |
|
|
|
plugins = TTkodeHelper._getPlugins() |
|
|
|
assert plugins == [] |
|
assert isinstance(plugins, list) |
|
|
|
def test_get_plugins_with_instances(self): |
|
"""Test getting plugins after some are created.""" |
|
# Clear and create test plugins |
|
TTkodePlugin.instances.clear() |
|
|
|
plugin1 = TTkodePlugin(name="TestPlugin1") |
|
plugin2 = TTkodePlugin(name="TestPlugin2") |
|
|
|
plugins = TTkodeHelper._getPlugins() |
|
|
|
assert len(plugins) == 2 |
|
assert plugin1 in plugins |
|
assert plugin2 in plugins |
|
|
|
def test_get_plugins_returns_reference(self): |
|
"""Test that _getPlugins returns a reference to the instances list.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
plugins = TTkodeHelper._getPlugins() |
|
|
|
# Should be the same list object |
|
assert plugins is TTkodePlugin.instances |
|
|
|
@pytest.mark.skip(reason="Requires plugin folder and file system setup") |
|
def test_load_plugins_from_folder(self, tmp_path): |
|
"""Test loading plugins from a folder.""" |
|
# This would require creating actual plugin files |
|
# and modifying the plugin folder path |
|
pass |
|
|
|
@pytest.mark.skip(reason="Requires full TTKode UI instance") |
|
def test_run_plugins_with_activity_widgets(self): |
|
"""Test running plugins with activity widgets.""" |
|
# This requires a full TTKode instance with activity bar |
|
pass |
|
|
|
@pytest.mark.skip(reason="Requires full TTKode UI instance") |
|
def test_run_plugins_with_panel_widgets(self): |
|
"""Test running plugins with panel widgets.""" |
|
# This requires a full TTKode instance with panels |
|
pass |
|
|
|
def test_plugin_init_execution(self): |
|
"""Test that plugin init callbacks are executed.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
init_executed = [] |
|
|
|
def init_callback(): |
|
init_executed.append(True) |
|
|
|
plugin = TTkodePlugin(name="InitPlugin", init=init_callback) |
|
|
|
# Simulate what _loadPlugins does |
|
for mod in TTkodePlugin.instances: |
|
if mod.init is not None: |
|
mod.init() |
|
|
|
assert len(init_executed) == 1 |
|
|
|
def test_plugin_apply_execution(self): |
|
"""Test that plugin apply callbacks are executed.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
apply_executed = [] |
|
|
|
def apply_callback(): |
|
apply_executed.append(True) |
|
|
|
plugin = TTkodePlugin(name="ApplyPlugin", apply=apply_callback) |
|
|
|
# Simulate what _runPlugins does |
|
for mod in TTkodePlugin.instances: |
|
if mod.apply is not None: |
|
mod.apply() |
|
|
|
assert len(apply_executed) == 1 |
|
|
|
def test_multiple_plugins_init(self): |
|
"""Test initializing multiple plugins.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
counters = {'plugin1': 0, 'plugin2': 0, 'plugin3': 0} |
|
|
|
def make_init(name): |
|
def init_cb(): |
|
counters[name] += 1 |
|
return init_cb |
|
|
|
plugin1 = TTkodePlugin(name="Plugin1", init=make_init('plugin1')) |
|
plugin2 = TTkodePlugin(name="Plugin2", init=make_init('plugin2')) |
|
plugin3 = TTkodePlugin(name="Plugin3", init=make_init('plugin3')) |
|
|
|
# Execute all init callbacks |
|
for mod in TTkodePlugin.instances: |
|
if mod.init is not None: |
|
mod.init() |
|
|
|
assert counters['plugin1'] == 1 |
|
assert counters['plugin2'] == 1 |
|
assert counters['plugin3'] == 1 |
|
|
|
def test_plugin_with_widgets_detection(self): |
|
"""Test detecting plugin widgets.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
activity_widget = TTkodePluginWidgetActivity( |
|
widget=ttk.TTkWidget(), |
|
activityName="TestActivity", |
|
icon=ttk.TTkString("📁") |
|
) |
|
|
|
panel_widget = TTkodePluginWidgetPanel( |
|
widget=ttk.TTkWidget(), |
|
panelName="TestPanel" |
|
) |
|
|
|
plugin = TTkodePlugin( |
|
name="WidgetPlugin", |
|
widgets=[activity_widget, panel_widget] |
|
) |
|
|
|
# Verify plugin has widgets |
|
assert len(plugin.widgets) == 2 |
|
|
|
# Count widget types |
|
activity_count = sum(1 for w in plugin.widgets if isinstance(w, TTkodePluginWidgetActivity)) |
|
panel_count = sum(1 for w in plugin.widgets if isinstance(w, TTkodePluginWidgetPanel)) |
|
|
|
assert activity_count == 1 |
|
assert panel_count == 1 |
|
|
|
def test_plugin_without_callbacks(self): |
|
"""Test plugin without any callbacks doesn't crash.""" |
|
TTkodePlugin.instances.clear() |
|
|
|
plugin = TTkodePlugin(name="MinimalPlugin") |
|
|
|
# These should not raise exceptions |
|
if plugin.init is not None: |
|
plugin.init() |
|
if plugin.apply is not None: |
|
plugin.apply() |
|
if plugin.run is not None: |
|
plugin.run() |
|
|
|
# If we get here, no exceptions were raised |
|
assert True
|
|
|