901594b99f
* avm2: Do not remove an EditText's selection on unfocus (fix #9006) There are significant differences between how selection and caret info work between AVM1 and AVM2. In AVM1, there is only a single, global selection, which applies to whichever element is currently focused. Therefore changing the focus necessarily erases any information of what was selected before. There can also be no active selection at all. In AVM2, every text field has its own independent selection info. It is NOT optional, the default selection is just a caret at position 0. If a field loses focus, the selection is not rendered, but it is still present. Movies such as #9006 rely on the same selection still being there once you give back focus to the field. Ruffle's model of selections (an Option per text field) is different from both the AVM1 model (an optional singleton) and the AVM2 model (mandatory per text field). This fix does not change that, it is only a narrow fix targeted at 9006. * avm2: implement selectionBegin/selectionEnd/caretIndex and add a test. The selection test validates a few situations, including the behaviour when unfocusing that was fixed in the previous commit. The test does not validate how the selection changes after replacing text, as there are still some inaccuracies there. * avm2: Additional selection fixes needed after merging with master. 1. The default caret for an AVM2 textbox is at the end of the textbox, not the beginning. 2. Selection should not be changed when focusing on a textbox in AVM2. 3. Fixed a test whose output.txt didn't actually match the flash player output. * avm2: Make the selection AVM checks compatible with mixed AVM, and revert the on_focus_changed parameters --------- Co-authored-by: Nathan Adams <dinnerbone@dinnerbone.com> |
||
---|---|---|
.. | ||
input-format | ||
tests | ||
Cargo.toml | ||
README.md |
README.md
SWF Regression Tests
Inside tests/swfs is a large collection of automated tests that are based around running a swf and seeing what happens.
To create a test, make a directory that looks like the following, at minimum:
- directory/
- test.swf
- test.toml
- output.txt
As best practice, please also include any source used to make the swf - such as test.fla
and any actionscript files.
Test Structure
test.toml
Except for num_ticks
, every other field and section is optional.
num_ticks = 1 # The amount of frames of the SWF to run.
tick_rate = 16.666 # The amount of time to process per tick. By default this uses the SWF frame rate.
sleep_to_meet_frame_rate = false # If true, sleep in between ticks to run at realtime speed. Necessary for some timer tests.
ignore = false # If true, ignore this test. Please comment why, ideally link to an issue, so we know what's up
output_path = "output.txt" # Path (relative to the directory containing test.toml) to the expected output
# Sometimes floating point math doesn't exactly 100% match between flash and rust.
# If you encounter this in a test, the following section will change the output testing from "exact" to "approximate"
# (when it comes to floating point numbers, at least.)
[approximations]
number_patterns = [] # A list of regex patterns with capture groups to additionally treat as approximate numbers
epsilon = 0.0 # The upper bound of any rounding errors. Default is the difference between 1.0 and the next largest representable number
max_relative = 0.0 # The default relative tolerance for testing values that are far-apart. Default is the difference between 1.0 and the next largest representable number
# Options for the player used to run this swf
[player_options]
max_execution_duration = { secs = 15, nanos = 0} # How long can actionscript execute for before being forcefully stopped
viewport_dimensions = { width = 100, height = 100, scale_factor = 1 } # The size of the player. Defaults to the swfs stage size
with_renderer = { optional = false, sample_count = 4, exclude_warp = false } # If this test requires a renderer to run. Optional will enable the renderer where available.
with_audio = false # If this test requires an audio backend to run.
with_video = false # If this test requires a video decoder backend to run.
# Whether or not to compare the image rendered with an expected image
# The comparison part of a test is optional and only runs when `imgtests` feature is enabled
# This requires a render to be setup for this test
[image_comparison]
tolerance = 0 # The tolerance per pixel channel to be considered "the same". Increase as needed with tests that aren't pixel perfect across platforms.
max_outliers = 0 # Maximum number of outliers allowed over the given tolerance levels. Increase as needed with tests that aren't pixel perfect across platforms.
Frame-based tests
Some older tests break with tick timing, so they instead use frames. When num_frames
is specified, Ruffle's tick
method will not be called and tick-based processing will not occur. Instead, run_frame
will be called directly.
Tests that use video or other tick processing must not use num_frames
, and in general its use is deprecated.
num_frames = 1 # The amount of frames of the swf to run
sleep_to_meet_frame_rate = false # If true, slow the tick rate to match the movies requested fps rate