from importlib.util import module_from_spec, spec_from_file_location from pathlib import Path import nonebot from PIL import Image nonebot.init() MODULE_PATH = Path(__file__).resolve().parents[1] / "konabot/plugins/fx_process/fx_handle.py" SPEC = spec_from_file_location("test_fx_handle_module", MODULE_PATH) assert SPEC is not None and SPEC.loader is not None fx_handle = module_from_spec(SPEC) SPEC.loader.exec_module(fx_handle) ImageFilterImplement = fx_handle.ImageFilterImplement INIT_MODULE_PATH = Path(__file__).resolve().parents[1] / "konabot/plugins/fx_process/__init__.py" INIT_SPEC = spec_from_file_location("test_fx_init_module", INIT_MODULE_PATH) assert INIT_SPEC is not None and INIT_SPEC.loader is not None fx_init = module_from_spec(INIT_SPEC) INIT_SPEC.loader.exec_module(fx_init) prase_input_args = fx_init.prase_input_args def test_apply_jpeg_damage_keeps_size_and_rgba_mode(): image = Image.new("RGBA", (32, 24), (255, 0, 0, 128)) result = ImageFilterImplement.apply_jpeg_damage(image, 5) assert result.size == image.size assert result.mode == "RGBA" assert result.getchannel("A").getextrema() == (128, 128) def test_apply_jpeg_damage_clamps_quality_range(): image = Image.new("RGB", (16, 16), (123, 222, 111)) low = ImageFilterImplement.apply_jpeg_damage(image, -10) high = ImageFilterImplement.apply_jpeg_damage(image, 999) assert low.size == image.size assert high.size == image.size assert low.mode == "RGBA" assert high.mode == "RGBA" def test_apply_resize_clamps_small_result_to_at_least_one_pixel(): image = Image.new("RGBA", (10, 10), (255, 0, 0, 255)) result = ImageFilterImplement.apply_resize(image, 0.01) assert result.size == (1, 1) def test_apply_resize_negative_x_with_positive_y_only_mirrors_horizontally(): image = Image.new("RGBA", (2, 1)) image.putpixel((0, 0), (255, 0, 0, 255)) image.putpixel((1, 0), (0, 0, 255, 255)) result = ImageFilterImplement.apply_resize(image, -1, 1) assert result.size == (2, 1) assert result.getpixel((0, 0)) == (0, 0, 255, 255) assert result.getpixel((1, 0)) == (255, 0, 0, 255) def test_apply_resize_negative_scale_without_y_flips_both_axes(): image = Image.new("RGBA", (2, 2)) image.putpixel((0, 0), (255, 0, 0, 255)) image.putpixel((1, 0), (0, 255, 0, 255)) image.putpixel((0, 1), (0, 0, 255, 255)) image.putpixel((1, 1), (255, 255, 0, 255)) result = ImageFilterImplement.apply_resize(image, -1) assert result.size == (2, 2) assert result.getpixel((0, 0)) == (255, 255, 0, 255) assert result.getpixel((1, 0)) == (0, 0, 255, 255) assert result.getpixel((0, 1)) == (0, 255, 0, 255) assert result.getpixel((1, 1)) == (255, 0, 0, 255) def test_prase_input_args_parses_resize_second_argument_as_float(): filters = prase_input_args("缩放 2 3") assert len(filters) == 1 assert filters[0].name == "缩放" assert filters[0].args == [2.0, 3.0]