Cube插件的开发目的是为了方便在游戏中进行调试代码,所以它涵盖了代码的运行,表的数据显示,错误捕获,单元测试几个方面。这些并非只用于IGAS的代码测试,本身适用于各种情况。针对IGAS的日志系统,单独提供了一个日志监视工具以便开发插件时能够跟踪插件运行状况。
快捷键绑定
如图,你可以在快捷键设置中,指定几个按键给各个部件,这样方便调用,简易错误清单(Simple Bug List)无需设置,出错时,会在小地图上显示出一个错误图标,点击即可查看。我一般设置到小键盘,不影响其他按键使用。
简易开发工具(Simple Dev Tool)
你可以键入/cube code 来打开这个工具,当然给定快捷键来打开它是更方便的方式。
- 布局很简单,左上角是一个下拉选择框,用于选择已经保存的代码片段的名称。、
- 下拉框右边是一个输入框,里面是代码片段的名称,一般给一个简单的说明性名字比较好,如果是新建的代码片段,保存前,一定要给定一个名字,如果该名字在已经保存的代码片段名称中存在,那么前一个将被覆盖。
右上角的自动运行(AutoRun),对于已经保存过的代码片段,选择上之后,以后在进入游戏后3秒,就会被加载入游戏,实际来说,一些简单的插件功能可以用此功能来实现自动加载。
- 中间是代码输入框体。具有代码着色和自动缩进功能,感谢Kristofer Karlsson 的 FAIAP。
- 新设(New) - 新建一个代码片段,实际意义就是清空代码片段名称输入框,清空代码输入框。
- 保存(Save) - 如果代码名称输入框和代码输入框都不为空,那么保存当前代码片段为该名称。
- 删除(Del) - 删除当前代码名称代表的代码片段。
- 运行(Run) - 运行代码输入框中的代码,不管它是否保存过,出错的话,会显示一个错误结果画面出来。
- 单元测试(Unit Test) - 稍后单独列出。
- 代码示例 : 在写邮件的界面上,在收信人后面增加一个下拉按钮,用于选择你的好友。你们可以自己实验下效果。
1 -- 获取收信人输入框,并转换为IGAS用
2 local name = IGAS:GetWrapper(SendMailNameEditBox)
3
4 -- 创建一个下拉框界面元素
5 local btn = IGAS:NewFrame("ComboBox", "cboList", name)
6 -- 设置下拉框位置
7 btn:SetPoint("LEFT", name, "LEFT", -10, 0)
8 btn:SetPoint("RIGHT", name, "RIGHT", 24, 0)
9 -- 使这个下拉框显示在收信人输入框下面,
10 btn.FrameLevel = name.FrameLevel -1
11 -- 去除下拉框的背景,让显示效果看起来更好
12 btn:SetBackdrop(nil)
13 -- 隐藏下拉框的输入框,我们只需要用到下拉按钮
14 btn:GetTextObject().Visible = false
15
16 -- 当下拉框显示时,也就是打开送信界面的时候,我们将好友加入下拉框的列表中
17 function btn:OnShow()
18 -- 清除列表
19 btn:Clear()
20
21 -- 將自己的好友加入名單
22 for i=1, GetNumFriends() do
23 local name = GetFriendInfo(i)
24
25 -- 添加好友名字
26 btn:AddItem(name, name)
27 end--]]
28
29 --[[ 將自己的工會會友加入名單,这里先注释掉了。如果想要这功能,把这行删除
30 for i = 1, GetNumGuildMembers(1) do
31 local name = GetGuildRosterInfo(i)
32 btn:AddItem(name, name)
33 end--]]
34 end
35
36 -- 当在下拉框中选择一个人名时,将这个名字设置到收信人输入框中
37 function btn:OnValueChanged(value)
38 name.Text = self.Text or ""
39 end
40
41 -- 当收信人输入框的文字被设置为空时,同时清除下拉框的选择项。
42 name:StackScript("OnTextSet", function(self)
43 if self:GetText() == "" then
44 btn.Value = nil
45 end
46 end)
单元测试(Unit Test)
单元测试是应Simonw要求添加进来的,虽然目前为止我还是没怎么用到。不过,这是一个很强大的测试用功能,能够同时完成多个函数的运行测试,并给出结果或者错误的详细信息。这个功能利用了Addon类中提供的Module子类带来的独立环境功能。
- 此处代码段中非函数内定义的函数和变量,请定义为全局变量,运行时会使用独立环境,不会污染_G。非全局函数,无法被测试程序查找到。
- 代码片段中的所有以"test"开头或者结尾的函数都被认为是一段独立的待测试代码。这些函数不能具有参数,因为测试时不会有参数传入。
- 名为setup的函数,将在每个待测试函数调用前,被调用,用以做某些初始化操作。
- 名为teardown的函数,将在每个待测试函数调用后,被调用,用以做销毁操作。
- 除这些以外的函数或代码块会在测试前被执行,它产生的函数或者变量等都会保存在测试环境中,等待被待测试函数调用。
- 另提供了一些额外的断言函数,方便测试,[msg]代表错误消息,可选。
- fail( [msg] )
- 一直失败.
- assert( assertion, [msg] )
- 失败, 如果 'assertion' 是 false 或者 nil.
- assert_true( actual, [msg] )
- 失败, 如果 'actual' 不是 true.
- assert_false( actual, [msg] )
- 失败, 如果 'actual' 不是 false.
- assert_equal( expected, actual, [msg] )
- 失败, 如果 'actual' 不等于 'expected'.
- assert_not_equal( unexpected, actual, [msg] )
- 失败, 如果 'actual' 等于 'unexpected'.
- assert_match( pattern, actual, [msg] )
- Fails, 如果字符串 'actual' 不匹配 'pattern'.
- assert_not_match( pattern, actual, [msg] )
- 失败, 如果字符串'actual'匹配'pattern'.
- assert_nil( actual, [msg] )
- 失败, 如果 'actual'不是 nil.
- assert_not_nil( actual, [msg] )
- 失败, 如果 'actual'是nil.
- assert_boolean( actual, [msg] )
- 失败, 如果 'actual'不是true或者false.
- assert_not_boolean( actual, [msg] )
- 失败, 如果 'actual'是true或者false.
- assert_number( actual, [msg] )
- 失败, 如果 'actual'不是number
- assert_not_number( actual, [msg] )
- 失败, 如果 'actual'是number.
- assert_string( actual, [msg] )
- 失败, 如果 'actual'不是string.
- assert_not_string( actual, [msg] )
- 失败, 如果 'actual'是string.
- assert_table( actual, [msg] )
- 失败, 如果 'actual'不是 table.
- assert_not_table( actual, [msg] )
- 失败, 如果 'actual'是table.
- assert_function( actual, [msg] )
- 失败, 如果 'actual'不是function.
- assert_not_function( actual, [msg] )
- 失败, 如果 'actual'是function.
- assert_thread( actual, [msg] )
- 失败, 如果 'actual'不是 thread (由coroutine.create or coroutine.wrap创建).
- assert_not_thread( actual, [msg] )
- 失败, 如果 'actual'是thread.
- assert_userdata( actual, [msg] )
- 失败, 如果 'actual'不是userdata.
- assert_not_userdata( actual, [msg] )
- 失败, 如果 'actual'是userdata.
- assert_error( [msg], func )
- 失败, 如果 'func' 不发生错误 (使用error()).
- assert_pass( [msg], func )
- 失败, 如果 'func'发生错误.
- fail( [msg] )
- 示例:
1 function setup()
2 a = 0
3 end
4
5 function test_1()
6 assert_not_number(a)
7 end
8
9 function test_2()
10 assert_number(a)
11 end
12
13 function test_3()
14 a = true
15 assert_false(a)
16 end
17
18 fucntion teardown()
19 a = nil
20 end
- 结果示意图
简易调试工具(Simple Debug Tool)
这个工具是用于检查表的结构,每次点开表节点时,才会去读取其子元素的结构,这样只要表本身数据不是特别大,该工具都能保证读取速度正常。在最开头的输入框中,输入表在_G中的名称,或者可以获取到表的代码行,回车后,如果表被查找到,将被显示出来。
简易错误清单(Simple Bug List)
用于捕获错误信息,帮助查找出错位置。出错后,小地图上会出现一个问号的图标,点击即可打开这个界面。
简易日志监视(Simple Log View)
通过捕获错误,一般能解决掉插件的出错问题,但一些比较大型的插件,仅了解出错位置并不足以判断出错的情况,往往需要了解出错前插件的运行状态,在IGAS系统中,提供了一个日志处理类,它会按照日志等级出力消息。在这个工具中,使用监视日志(Add Logger)添加一个基于IGAS的插件名称,这个名称一般也就是该插件使用的日志对象的名称。之后,日志监视器会给这个日志对象添加一个处理用Handle,获取日志的出力信息。默认会保存200条记录,便于需要时查看出错时的插件运行流程。


