
Ruffle 测试工程实践EmptyFunctionName 验收测试的 source.tar.xz 归档机制与 Windows 大小写敏感文件系统问题【免费下载链接】ruffleA Flash Player emulator written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle导读本文以 Ruffle 仓库中一个特殊的 AS3 回归测试tests/tests/swfs/from_avmplus/as3/Definitions/Function/EmptyFunctionName/的 README 为核心讲清楚这个测试源码为什么不以散文件形式提交而是打进了source.tar.xz归档因为其中部分文件名仅以大小写区分会破坏 Windows 上的仓库检出同时给出完整的还原、编译mxmlc与运行验证流程。读完后你应当掌握该测试的还原编译步骤、config.xml各参数含义、test.toml/output.txt的回归机制以及在 Windows 上启用大小写敏感目录的实际做法。一、这个测试是什么来自 avmplus 的 AS3 函数命名验收测试该测试目录位于 EmptyFunctionName属于 Ruffle 回归测试树 tests/tests/swfs/from_avmplus 的一部分。根据 from_avmplus 目录的 README这些测试文件是从 Adobe 的 avmplus 仓库test/acceptance拷贝并适配而来的原测试以 MPL 2.0 协议发布Ruffle 的适配版本沿用同一协议。从测试名与归档内容看EmptyFunctionName验证的是 AS3 中“函数名合法性与大小写敏感性”这一类语言规范函数名可以包含字母、数字、下划线与$且大小写不同的函数名是不同的函数。解压source.tar.xz后可以确认归档内实际包含的文件清单EmptyFunctionName/$a1.as EmptyFunctionName/C1.as EmptyFunctionName/Cases.as EmptyFunctionName/TestNameObj.as EmptyFunctionName/TestNameObjInner.as EmptyFunctionName/__a1.as EmptyFunctionName/__a1__.as EmptyFunctionName/_a1.as EmptyFunctionName/_a1_.as EmptyFunctionName/a$1.as EmptyFunctionName/a1$.as EmptyFunctionName/a1.as EmptyFunctionName/a_1.as EmptyFunctionName/cases.as EmptyFunctionName/pub$a1.as EmptyFunctionName/pubC1.as EmptyFunctionName/pub__a1.as EmptyFunctionName/pub__a1__.as EmptyFunctionName/pub_a1.as EmptyFunctionName/pub_a1_.as EmptyFunctionName/puba$1.as EmptyFunctionName/puba1$.as EmptyFunctionName/puba1.as EmptyFunctionName/puba_1.as EmptyFunctionName/pubcases.as Test.as注意其中同时存在Cases.as与cases.as两个文件——这正是整个归档机制存在的原因下一节详述。主测试脚本Test.as的结构体现了典型的 avmplus 验收测试写法package { import flash.display.MovieClip; public class Test extends MovieClip {} } import EmptyFunctionName.*; import com.adobe.test.Assert; class EmptyFunctionNameClass { // 构造函数名字与类名相同 function EmptyFunctionNameClass() { res EmptyName; } // 看起来像构造函数但大小写不同所以不是构造函数 function emptyFunctionNameClass() { return not the constructor; } function a1 () { return a1; } function A1 () { return A1; } function cases () { return cases; } function Cases () { return Cases; } // ... 共 14 个大小写/命名变体 } // 包外的顶层函数 b1/b_1/_b1/__b1/... 共 14 个 TESTOBJ new TestNameObj(); Assert.expectEq(inside class inside package function Name a1(), a1, TESTOBJ.puba1()); // ... 共 52 组断言测试把函数按四个维度分组断言类内/类外 × 包内/包外并用com.adobe.test.Assert.expectEq比对函数返回值。其中Assert辅助类来自 from_avmplus/liblib被加入 mxmlc 的 source path 后即可使用见下文config.xml。二、核心问题README 解释的“仅大小写不同的文件名”该测试目录下的 README.md 全文只有 5 行但解释了 Ruffle 仓库中一个真实的跨平台工程约束编译本测试前需先将source.tar.xz解压到当前目录然后按正常方式编译源码之所以被归档是因为部分文件名必须仅以大小写区分如cases.as与Cases.as如果把它们作为普通文件提交会“break the whole Ruffle repository on Windows”破坏整个 Ruffle 仓库在 Windows 上的工作因此在 Windows 上编译该测试时必须启用文件系统的大小写敏感性。背后的原理可以拆开说明Git 本身对路径是大小写敏感的仓库可以同时跟踪cases.as和Cases.as但 Windows 默认的 NTFS 卷是“大小写保留、大小写不敏感”的检出时cases.as与Cases.as会映射到同一个路径第二次写入会覆盖第一次导致源码互相损坏甚至引发工具链对整个工作区的异常行为把这对文件打进source.tar.xz后仓库中只保留归档这一个文件任何平台的检出都不会产生路径冲突归档本身由 source.tar.xz 提交到仓库Linux/macOS 开发者解压后得到两个独立文件Windows 开发者则需要额外的文件系统设置见第五节。配套地目录中的.gitignore也做了精细的白名单设计把解压出来的源码排除在版本控制之外避免有人解压后误提交* !.gitignore !config.xml !test.* !source.tar.xz !README.md即该目录下所有内容默认忽略仅显式保留.gitignore、config.xml、test.*对应已预编译的test.swf与test.toml、source.tar.xz和README.md。这也意味着目录里实际提交的文件恰好是.gitignore、README.md、config.xml、output.txt、source.tar.xz、test.swf、test.toml——output.txt随test.*规则被保留。三、还原与编译流程继承原文档操作步骤并补全原文档给出的操作是“解压source.tar.xz到当前目录然后正常编译”。结合 from_avmplus 总 README 中“所有测试均用 mxmlc 编译mxmlc -load-configconfig.xml Test.as”的说明完整的操作流程为# 1. 进入测试目录 cd tests/tests/swfs/from_avmplus/as3/Definitions/Function/EmptyFunctionName # 2. 解压归档需要系统装有 xz tar -xJf source.tar.xz # 得到 Test.as 与 EmptyFunctionName/ 子目录含 cases.as、Cases.as 等 25 个 .as 文件 # 3. 用 mxmlc 编译加载本目录的 config.xml mxmlc -load-configconfig.xml Test.as # 产出 test.swfconfig.xml 的完整内容及各参数含义如下编译前应理解它的配置意图flex-config compiler source-path path-element./path-element path-element../../../../lib/path-element /source-path debugfalse/debug omit-trace-statementsfalse/omit-trace-statements show-actionscript-warningsfalse/show-actionscript-warnings strictfalse/strict /compiler outputtest.swf/output /flex-configsource-path第一个元素.指向测试目录自身找到Test.as与EmptyFunctionName包目录第二个元素../../../../lib相对测试目录向上四级即 tests/tests/swfs/from_avmplus/lib提供com.adobe.test.Assert与Util辅助类。这与总 README 中“创建 mxmlc 配置并确保把lib加入 source path”的要求一致debugfalse不输出调试信息减小 SWF 体积omit-trace-statementsfalse保留trace()调用本测试的断言输出依赖运行时语句strictfalse关闭严格模式。总 README 也提到“如有必要在 AS3 设置中关闭 Strict Mode 以使某些测试可编译”outputtest.swf输出文件名与仓库中已提交的 test.swf 一致即仓库中已经预编译并提交了编译产物CI 与本地回归测试可直接使用无需每次重新编译。另外按总 README 的建议movie class 设置为Test、脚本位于Test.as本文展示的Test.as开头正是这种形态可保证 Ruffle 加载 SWF 时正确绑定入口类。四、测试如何被 Ruffle 执行test.toml 与 output.txt该测试目录中的 test.toml 内容为num_ticks 1这是 Ruffle SWF 回归测试框架见 tests/framework 与 tests/README.md使用的配置格式num_ticks指定 Ruffle 在加载 SWF 后需要驱动的帧数。EmptyFunctionName的全部断言都在入口帧顶层脚本中同步执行完毕因此 1 tick 就足够。output.txt 是期望输出基线共 52 行、每行以PASSED!结尾与Test.as中 52 组Assert.expectEq一一对应。摘录四个分组的代表行inside class inside package function Name a1() PASSED! inside class inside package function Name cases() PASSED! inside class inside package function Name Cases() PASSED! outside class outside package function Name bcases() PASSED!可以注意到cases()与Cases()两组断言并存且都要求通过——这正呼应了归档中cases.as/Cases.as这对仅大小写不同的源文件AS3 的命名空间区分大小写TestNameObj中的pubcases/pubCases分别委托给同名不同大小写的目标函数。若播放器把两个函数折叠为同一个或构造函数判定被不同大小写的同名函数emptyFunctionNameClass()返回not the constructor的那条断言干扰回归测试就会因输出与output.txt不一致而失败。从源码结构看这类断言最终验证的是 Ruffle AVM2 的属性/函数映射实现位于 core/src/avm2如property_map.rs、dynamic_map.rs能否按大小写敏感的键正确存取成员名该测试作为外部行为基线为内部实现提供了验收依据。五、Windows 上的大小写敏感文件系统README 最后一条警告的落实方式README 明确指出在 Windows 上必须“enable case sensitivity”才能编译本测试。原因在于解压后的cases.as与Cases.as若落在默认的 NTFS 卷上会被视为同一路径。可行的处理路径有两条按目录启用大小写敏感较新版本的 Windows 10/11 支持对 NTFS 目录单独开启大小写敏感通常通过fsutil.exe file setCaseSensitiveInfo 目标目录 enable完成。对该目录执行后解压出的两个文件才能以独立实体并存mxmlc 才能正确分别编译它们。具体命令可用性取决于 Windows 版本使用前请以系统实际支持情况为准跨平台开发环境在 WSL/WSL2、Cygwin 的 POSIX 文件系统或 Git Bash 提供的 Linux 侧环境如 Ubuntu 发行版中文件系统天然大小写敏感解压即可直接编译这也是 Ruffle 这类 Rust 项目最常见的开发方式Ruffle 本体使用 Rust 工具链Cargo.toml 位于仓库根目录。需要强调的前提无论哪种方式Ruffle 仓库本身不需要任何改动——归档 白名单.gitignore的设计已经保证所有平台的检出都是安全的大小写敏感设置只是“解压并编译源码”这一步的本地前置条件。如果你只运行 Ruffle 的回归测试套件而不重新编译该 SWF仓库中已提交的test.swf与test.toml足以让测试直接通过完全绕开大小写问题。六、要点回顾该目录的 README.md 虽只有 5 行却完整说明了 Ruffle 回归测试树中一类特殊测试的工程约束源码因存在仅大小写不同的文件名cases.as/Cases.as而归档为 source.tar.xz避免在 Windows 等大小写不敏感文件系统上破坏整个仓库还原编译流程为tar -xJf source.tar.xz→mxmlc -load-configconfig.xml Test.as其中 config.xml 的 source path 需包含测试目录自身与../../../../libAssert/Util 所在处test.toml 的num_ticks 1加上 output.txt 的 52 行PASSED!基线构成 Ruffle 对该 AS3 大小写敏感函数命名行为的可验证回归这套“归档源码 白名单 .gitignore 预提交 SWF 与期望输出”的模式是跨平台测试仓库处理大小写敏感命名冲突的一种可复用范式遇到类似约束时可参照其结构组织自己的测试。【免费下载链接】ruffleA Flash Player emulator written in Rust项目地址: https://gitcode.com/GitHub_Trending/ru/ruffle创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考