Sweden-Number/dlls/vbscript/tests/lang.vbs

868 lines
20 KiB
Plaintext

'
' Copyright 2011 Jacek Caban for CodeWeavers
'
' This library is free software; you can redistribute it and/or
' modify it under the terms of the GNU Lesser General Public
' License as published by the Free Software Foundation; either
' version 2.1 of the License, or (at your option) any later version.
'
' This library is distributed in the hope that it will be useful,
' but WITHOUT ANY WARRANTY; without even the implied warranty of
' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
' Lesser General Public License for more details.
'
' You should have received a copy of the GNU Lesser General Public
' License along with this library; if not, write to the Free Software
' Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
'
Option Explicit
dim x, y, z
call ok(true, "true is not true?")
ok true, "true is not true?"
call ok((true), "true is not true?")
ok not false, "not false but not true?"
ok not not true, "not not true but not true?"
Call ok(true = true, "true = true is false")
Call ok(false = false, "false = false is false")
Call ok(not (true = false), "true = false is true")
Call ok("x" = "x", """x"" = ""x"" is false")
Call ok(empty = empty, "empty = empty is false")
Call ok(empty = "", "empty = """" is false")
Call ok(0 = 0.0, "0 <> 0.0")
Call ok(16 = &h10&, "16 <> &h10&")
Call ok(010 = 10, "010 <> 10")
Call ok(10. = 10, "10. <> 10")
Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
Call ok(&hffFFffFF& = -1, "&hffFFffFF& <> -1")
Call ok(--1 = 1, "--1 = " & --1)
Call ok(-empty = 0, "-empty = " & (-empty))
Call ok(true = -1, "! true = -1")
Call ok(false = 0, "false <> 0")
Call ok(&hff = 255, "&hff <> 255")
Call ok(&Hff = 255, "&Hff <> 255")
x = "xx"
Call ok(x = "xx", "x = " & x & " expected ""xx""")
Call ok(true <> false, "true <> false is false")
Call ok(not (true <> true), "true <> true is true")
Call ok(not ("x" <> "x"), """x"" <> ""x"" is true")
Call ok(not (empty <> empty), "empty <> empty is true")
Call ok(x <> "x", "x = ""x""")
Call ok("true" <> true, """true"" = true is true")
Call ok("" = true = false, """"" = true = false is false")
Call ok(not(false = true = ""), "false = true = """" is true")
Call ok(not (false = false <> false = false), "false = false <> false = false is true")
Call ok(not ("" <> false = false), """"" <> false = false is true")
Call ok(getVT(false) = "VT_BOOL", "getVT(false) is not VT_BOOL")
Call ok(getVT(true) = "VT_BOOL", "getVT(true) is not VT_BOOL")
Call ok(getVT("") = "VT_BSTR", "getVT("""") is not VT_BSTR")
Call ok(getVT("test") = "VT_BSTR", "getVT(""test"") is not VT_BSTR")
Call ok(getVT(Empty) = "VT_EMPTY", "getVT(Empty) is not VT_EMPTY")
Call ok(getVT(null) = "VT_NULL", "getVT(null) is not VT_NULL")
Call ok(getVT(0) = "VT_I2", "getVT(0) is not VT_I2")
Call ok(getVT(1) = "VT_I2", "getVT(1) is not VT_I2")
Call ok(getVT(0.5) = "VT_R8", "getVT(0.5) is not VT_R8")
Call ok(getVT(0.0) = "VT_R8", "getVT(0.0) is not VT_R8")
Call ok(getVT(2147483647) = "VT_I4", "getVT(2147483647) is not VT_I4")
Call ok(getVT(2147483648) = "VT_R8", "getVT(2147483648) is not VT_R8")
Call ok(getVT(&h10&) = "VT_I2", "getVT(&h10&) is not VT_I2")
Call ok(getVT(&h10000&) = "VT_I4", "getVT(&h10000&) is not VT_I4")
Call ok(getVT(&H10000&) = "VT_I4", "getVT(&H10000&) is not VT_I4")
Call ok(getVT(&hffFFffFF&) = "VT_I2", "getVT(&hffFFffFF&) is not VT_I2")
Call ok(getVT(1 & 100000) = "VT_BSTR", "getVT(1 & 100000) is not VT_BSTR")
Call ok(getVT(-empty) = "VT_I2", "getVT(-empty) = " & getVT(-empty))
Call ok(getVT(-null) = "VT_NULL", "getVT(-null) = " & getVT(-null))
Call ok(getVT(y) = "VT_EMPTY*", "getVT(y) = " & getVT(y))
Call ok(getVT(nothing) = "VT_DISPATCH", "getVT(nothing) = " & getVT(nothing))
set x = nothing
Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=nothing) = " & getVT(x))
x = true
Call ok(getVT(x) = "VT_BOOL*", "getVT(x) = " & getVT(x))
Call ok(getVT(false or true) = "VT_BOOL", "getVT(false) is not VT_BOOL")
x = "x"
Call ok(getVT(x) = "VT_BSTR*", "getVT(x) is not VT_BSTR*")
x = 0.0
Call ok(getVT(x) = "VT_R8*", "getVT(x) = " & getVT(x))
Call ok(isNullDisp(nothing), "nothing is not nulldisp?")
x = "xx"
Call ok("ab" & "cd" = "abcd", """ab"" & ""cd"" <> ""abcd""")
Call ok("ab " & null = "ab ", """ab"" & null = " & ("ab " & null))
Call ok("ab " & empty = "ab ", """ab"" & empty = " & ("ab " & empty))
Call ok(1 & 100000 = "1100000", "1 & 100000 = " & (1 & 100000))
Call ok("ab" & x = "abxx", """ab"" & x = " & ("ab"&x))
if(isEnglishLang) then
Call ok("" & true = "True", """"" & true = " & true)
Call ok(true & false = "TrueFalse", "true & false = " & (true & false))
end if
call ok(true and true, "true and true is not true")
call ok(true and not false, "true and not false is not true")
call ok(not (false and true), "not (false and true) is not true")
call ok(getVT(null and true) = "VT_NULL", "getVT(null and true) = " & getVT(null and true))
call ok(false or true, "false or uie is false?")
call ok(not (false or false), "false or false is not false?")
call ok(false and false or true, "false and false or true is false?")
call ok(true or false and false, "true or false and false is false?")
call ok(null or true, "null or true is false")
call ok(true xor false, "true xor false is false?")
call ok(not (false xor false), "false xor false is true?")
call ok(not (true or false xor true), "true or false xor true is true?")
call ok(not (true xor false or true), "true xor false or true is true?")
call ok(false eqv false, "false does not equal false?")
call ok(not (false eqv true), "false equals true?")
call ok(getVT(false eqv null) = "VT_NULL", "getVT(false eqv null) = " & getVT(false eqv null))
call ok(true imp true, "true does not imp true?")
call ok(false imp false, "false does not imp false?")
call ok(not (true imp false), "true imp false?")
call ok(false imp null, "false imp null is false?")
Call ok(2 >= 1, "! 2 >= 1")
Call ok(2 >= 2, "! 2 >= 2")
Call ok(not(true >= 2), "true >= 2 ?")
Call ok(2 > 1, "! 2 > 1")
Call ok(false > true, "! false < true")
Call ok(0 > true, "! 0 > true")
Call ok(not (true > 0), "true > 0")
Call ok(not (0 > 1 = 1), "0 > 1 = 1")
Call ok(1 < 2, "! 1 < 2")
Call ok(1 = 1 < 0, "! 1 = 1 < 0")
Call ok(1 <= 2, "! 1 <= 2")
Call ok(2 <= 2, "! 2 <= 2")
x = 3
Call ok(2+2 = 4, "2+2 = " & (2+2))
Call ok(false + 6 + true = 5, "false + 6 + true <> 5")
Call ok(getVT(2+null) = "VT_NULL", "getVT(2+null) = " & getVT(2+null))
Call ok(2+empty = 2, "2+empty = " & (2+empty))
Call ok(x+x = 6, "x+x = " & (x+x))
Call ok(5-1 = 4, "5-1 = " & (5-1))
Call ok(3+5-true = 9, "3+5-true <> 9")
Call ok(getVT(2-null) = "VT_NULL", "getVT(2-null) = " & getVT(2-null))
Call ok(2-empty = 2, "2-empty = " & (2-empty))
Call ok(2-x = -1, "2-x = " & (2-x))
Call ok(9 Mod 6 = 3, "9 Mod 6 = " & (9 Mod 6))
Call ok(11.6 Mod 5.5 = False, "11.6 Mod 5.5 = " & (11.6 Mod 5.5 = 0.6))
Call ok(7 Mod 4+2 = 5, "7 Mod 4+2 <> 5")
Call ok(getVT(2 mod null) = "VT_NULL", "getVT(2 mod null) = " & getVT(2 mod null))
Call ok(getVT(null mod 2) = "VT_NULL", "getVT(null mod 2) = " & getVT(null mod 2))
'FIXME: Call ok(empty mod 2 = 0, "empty mod 2 = " & (empty mod 2))
Call ok(5 \ 2 = 2, "5 \ 2 = " & (5\2))
Call ok(4.6 \ 1.5 = 2, "4.6 \ 1.5 = " & (4.6\1.5))
Call ok(4.6 \ 1.49 = 5, "4.6 \ 1.49 = " & (4.6\1.49))
Call ok(2+3\4 = 2, "2+3\4 = " & (2+3\4))
Call ok(2*3 = 6, "2*3 = " & (2*3))
Call ok(3/2 = 1.5, "3/2 = " & (3/2))
Call ok(5\4/2 = 2, "5\4/2 = " & (5\2/1))
Call ok(12/3\2 = 2, "12/3\2 = " & (12/3\2))
Call ok(2^3 = 8, "2^3 = " & (2^3))
Call ok(2^3^2 = 64, "2^3^2 = " & (2^3^2))
Call ok(-3^2 = 9, "-3^2 = " & (-3^2))
Call ok(2*3^2 = 18, "2*3^2 = " & (2*3^2))
x =_
3
x _
= 3
x = 3
if true then y = true : x = y
ok x, "x is false"
x = true : if false then x = false
ok x, "x is false, if false called?"
if not false then x = true
ok x, "x is false, if not false not called?"
if not false then x = "test" : x = true
ok x, "x is false, if not false not called?"
if false then x = y : call ok(false, "if false .. : called")
if false then x = y : call ok(false, "if false .. : called") else x = "else"
Call ok(x = "else", "else not called?")
if true then x = y else y = x : Call ok(false, "in else?")
if false then :
if false then x = y : if true then call ok(false, "embedded if called")
if false then x=1 else x=2 end if
if false then
ok false, "if false called"
end if
x = true
if x then
x = false
end if
Call ok(not x, "x is false, if not evaluated?")
x = false
If false Then
Call ok(false, "inside if false")
Else
x = true
End If
Call ok(x, "else not called?")
x = false
If false Then
Call ok(false, "inside if false")
ElseIf not True Then
Call ok(false, "inside elseif not true")
Else
x = true
End If
Call ok(x, "else not called?")
x = false
If false Then
Call ok(false, "inside if false")
x = 1
y = 10+x
ElseIf not False Then
x = true
Else
Call ok(false, "inside else not true")
End If
Call ok(x, "elseif not called?")
x = false
If false Then
Call ok(false, "inside if false")
ElseIf not False Then
x = true
End If
Call ok(x, "elseif not called?")
x = false
if 1 then x = true
Call ok(x, "if 1 not run?")
x = false
if &h10000& then x = true
Call ok(x, "if &h10000& not run?")
x = false
y = false
while not (x and y)
if x then
y = true
end if
x = true
wend
call ok((x and y), "x or y is false after while")
while false
wend
x = false
y = false
do while not (x and y)
if x then
y = true
end if
x = true
loop
call ok((x and y), "x or y is false after while")
do while false
loop
do while true
exit do
ok false, "exit do didn't work"
loop
x = false
y = false
do until x and y
if x then
y = true
end if
x = true
loop
call ok((x and y), "x or y is false after do until")
do until true
loop
do until false
exit do
ok false, "exit do didn't work"
loop
x = false
y = false
do
if x then
y = true
end if
x = true
loop until x and y
call ok((x and y), "x or y is false after while")
do
loop until true
do
exit do
ok false, "exit do didn't work"
loop until false
x = false
y = false
do
if x then
y = true
end if
x = true
loop while not (x and y)
call ok((x and y), "x or y is false after while")
do
loop while false
do
exit do
ok false, "exit do didn't work"
loop while true
y = "for1:"
for x = 5 to 8
y = y & " " & x
next
Call ok(y = "for1: 5 6 7 8", "y = " & y)
y = "for2:"
for x = 5 to 8 step 2
y = y & " " & x
next
Call ok(y = "for2: 5 7", "y = " & y)
y = "for3:"
x = 2
for x = x+3 to 8
y = y & " " & x
next
Call ok(y = "for3: 5 6 7 8", "y = " & y)
y = "for4:"
for x = 5 to 4
y = y & " " & x
next
Call ok(y = "for4:", "y = " & y)
y = "for5:"
for x = 5 to 3 step true
y = y & " " & x
next
Call ok(y = "for5: 5 4 3", "y = " & y)
y = "for6:"
z = 4
for x = 5 to z step 3-4
y = y & " " & x
z = 0
next
Call ok(y = "for6: 5 4", "y = " & y)
y = "for7:"
z = 1
for x = 5 to 8 step z
y = y & " " & x
z = 2
next
Call ok(y = "for7: 5 6 7 8", "y = " & y)
y = "for8:"
for x = 5 to 8
y = y & " " & x
x = x+1
next
Call ok(y = "for8: 5 7", "y = " & y)
for x = 1.5 to 1
Call ok(false, "for..to called when unexpected")
next
for x = 1 to 100
exit for
Call ok(false, "exit for not escaped the loop?")
next
do while true
for x = 1 to 100
exit do
next
loop
Call collectionObj.reset()
y = 0
x = 10
for each x in collectionObj
y = y+1
Call ok(x = y, "x <> y")
next
Call ok(y = 3, "y = " & y)
Call ok(getVT(x) = "VT_EMPTY*", "getVT(x) = " & getVT(x))
Call collectionObj.reset()
y = false
for each x in collectionObj
if x = 2 then exit for
y = 1
next
Call ok(y = 1, "y = " & y)
Call ok(x = 2, "x = " & x)
if false then
Sub testsub
x = true
End Sub
end if
x = false
Call testsub
Call ok(x, "x is false, testsub not called?")
Sub SubSetTrue(v)
Call ok(not v, "v is not true")
v = true
End Sub
x = false
SubSetTrue x
Call ok(x, "x was not set by SubSetTrue")
SubSetTrue false
Call ok(not false, "false is no longer false?")
Sub SubSetTrue2(ByRef v)
Call ok(not v, "v is not true")
v = true
End Sub
x = false
SubSetTrue2 x
Call ok(x, "x was not set by SubSetTrue")
Sub TestSubArgVal(ByVal v)
Call ok(not v, "v is not false")
v = true
Call ok(v, "v is not true?")
End Sub
x = false
Call TestSubArgVal(x)
Call ok(not x, "x is true after TestSubArgVal call?")
Sub TestSubMultiArgs(a,b,c,d,e)
Call ok(a=1, "a = " & a)
Call ok(b=2, "b = " & b)
Call ok(c=3, "c = " & c)
Call ok(d=4, "d = " & d)
Call ok(e=5, "e = " & e)
End Sub
Sub TestSubExit(ByRef a)
If a Then
Exit Sub
End If
Call ok(false, "Exit Sub not called?")
End Sub
Call TestSubExit(true)
Sub TestSubExit2
for x = 1 to 100
Exit Sub
next
End Sub
Call TestSubExit2
TestSubMultiArgs 1, 2, 3, 4, 5
Call TestSubMultiArgs(1, 2, 3, 4, 5)
Sub TestSubLocalVal
x = false
Call ok(not x, "local x is not false?")
Dim x
Dim a,b, c
End Sub
x = true
y = true
Call TestSubLocalVal
Call ok(x, "global x is not true?")
Public Sub TestPublicSub
End Sub
Call TestPublicSub
Private Sub TestPrivateSub
End Sub
Call TestPrivateSub
if false then
Function testfunc
x = true
End Function
end if
x = false
Call TestFunc
Call ok(x, "x is false, testfunc not called?")
Function FuncSetTrue(v)
Call ok(not v, "v is not true")
v = true
End Function
x = false
FuncSetTrue x
Call ok(x, "x was not set by FuncSetTrue")
FuncSetTrue false
Call ok(not false, "false is no longer false?")
Function FuncSetTrue2(ByRef v)
Call ok(not v, "v is not true")
v = true
End Function
x = false
FuncSetTrue2 x
Call ok(x, "x was not set by FuncSetTrue")
Function TestFuncArgVal(ByVal v)
Call ok(not v, "v is not false")
v = true
Call ok(v, "v is not true?")
End Function
x = false
Call TestFuncArgVal(x)
Call ok(not x, "x is true after TestFuncArgVal call?")
Function TestFuncMultiArgs(a,b,c,d,e)
Call ok(a=1, "a = " & a)
Call ok(b=2, "b = " & b)
Call ok(c=3, "c = " & c)
Call ok(d=4, "d = " & d)
Call ok(e=5, "e = " & e)
End Function
TestFuncMultiArgs 1, 2, 3, 4, 5
Call TestFuncMultiArgs(1, 2, 3, 4, 5)
Function TestFuncLocalVal
x = false
Call ok(not x, "local x is not false?")
Dim x
End Function
x = true
y = true
Call TestFuncLocalVal
Call ok(x, "global x is not true?")
Function TestFuncExit(ByRef a)
If a Then
Exit Function
End If
Call ok(false, "Exit Function not called?")
End Function
Call TestFuncExit(true)
Function TestFuncExit2(ByRef a)
For x = 1 to 100
For y = 1 to 100
Exit Function
Next
Next
Call ok(false, "Exit Function not called?")
End Function
Call TestFuncExit2(true)
Sub SubParseTest
End Sub : x = false
Call SubParseTest
Function FuncParseTest
End Function : x = false
Function ReturnTrue
ReturnTrue = false
ReturnTrue = true
End Function
Call ok(ReturnTrue(), "ReturnTrue returned false?")
Function SetVal(ByRef x, ByVal v)
x = v
SetVal = x
Exit Function
End Function
x = false
ok SetVal(x, true), "SetVal returned false?"
Call ok(x, "x is not set to true by SetVal?")
Public Function TestPublicFunc
End Function
Call TestPublicFunc
Private Function TestPrivateFunc
End Function
Call TestPrivateFunc
' Stop has an effect only in debugging mode
Stop
set x = testObj
Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x=testObj) = " & getVT(x))
Dim obj
Set obj = New EmptyClass
Call ok(getVT(obj) = "VT_DISPATCH*", "getVT(obj) = " & getVT(obj))
Class EmptyClass
End Class
Set x = obj
Call ok(getVT(x) = "VT_DISPATCH*", "getVT(x) = " & getVT(x))
Class TestClass
Public publicProp
Private privateProp
Public Function publicFunction()
privateSub()
publicFunction = 4
End Function
Public Property Get gsProp()
gsProp = privateProp
funcCalled = "gsProp get"
exit property
Call ok(false, "exit property not returned?")
End Property
Public Default Property Get DefValGet
DefValGet = privateProp
funcCalled = "GetDefVal"
End Property
Public Property Let DefValGet(x)
End Property
Public publicProp2
Public Sub publicSub
End Sub
Public Property Let gsProp(val)
privateProp = val
funcCalled = "gsProp let"
exit property
Call ok(false, "exit property not returned?")
End Property
Public Property Set gsProp(val)
funcCalled = "gsProp set"
exit property
Call ok(false, "exit property not returned?")
End Property
Public Sub setPrivateProp(x)
privateProp = x
End Sub
Function getPrivateProp
getPrivateProp = privateProp
End Function
Private Sub privateSub
End Sub
Public Sub Class_Initialize
publicProp2 = 2
privateProp = true
End Sub
End Class
Call testDisp(new testClass)
Set obj = New TestClass
Call ok(obj.publicFunction = 4, "obj.publicFunction = " & obj.publicFunction)
Call ok(obj.publicFunction() = 4, "obj.publicFunction() = " & obj.publicFunction())
obj.publicSub()
Call obj.publicSub
Call obj.publicFunction()
Call ok(getVT(obj.publicProp) = "VT_EMPTY", "getVT(obj.publicProp) = " & getVT(obj.publicProp))
obj.publicProp = 3
Call ok(obj.publicProp = 3, "obj.publicProp = " & obj.publicProp)
obj.publicProp() = 3
Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
Call obj.setPrivateProp(6)
Call ok(obj.getPrivateProp = 6, "obj.getPrivateProp = " & obj.getPrivateProp)
Dim funcCalled
funcCalled = ""
Call ok(obj.gsProp = 6, "obj.gsProp = " & obj.gsProp)
Call ok(funcCalled = "gsProp get", "funcCalled = " & funcCalled)
obj.gsProp = 3
Call ok(funcCalled = "gsProp let", "funcCalled = " & funcCalled)
Call ok(obj.getPrivateProp = 3, "obj.getPrivateProp = " & obj.getPrivateProp)
Set obj.gsProp = New testclass
Call ok(funcCalled = "gsProp set", "funcCalled = " & funcCalled)
x = obj
Call ok(x = 3, "(x = obj) = " & x)
Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
funcCalled = ""
Call ok(obj = 3, "(x = obj) = " & obj)
Call ok(funcCalled = "GetDefVal", "funcCalled = " & funcCalled)
Call obj.Class_Initialize
Call ok(obj.getPrivateProp() = true, "obj.getPrivateProp() = " & obj.getPrivateProp())
x = (New testclass).publicProp
Class TermTest
Public Sub Class_Terminate()
funcCalled = "terminate"
End Sub
End Class
Set obj = New TermTest
funcCalled = ""
Set obj = Nothing
Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
Set obj = New TermTest
funcCalled = ""
Call obj.Class_Terminate
Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
funcCalled = ""
Set obj = Nothing
Call ok(funcCalled = "terminate", "funcCalled = " & funcCalled)
Call (New testclass).publicSub()
Call (New testclass).publicSub
x = "following ':' is correct syntax" :
x = "following ':' is correct syntax" :: :
:: x = "also correct syntax"
rem another ugly way for comments
x = "rem as simplestatement" : rem rem comment
:
Set obj = new EmptyClass
Set x = obj
Set y = new EmptyClass
Call ok(obj is x, "obj is not x")
Call ok(x is obj, "x is not obj")
Call ok(not (obj is y), "obj is not y")
Call ok(not obj is y, "obj is not y")
Call ok(not (x is Nothing), "x is 1")
Call ok(Nothing is Nothing, "Nothing is not Nothing")
Call ok(x is obj and true, "x is obj and true is false")
Class TestMe
Public Sub Test(MyMe)
Call ok(Me is MyMe, "Me is not MyMe")
End Sub
End Class
Set obj = New TestMe
Call obj.test(obj)
Call ok(getVT(test) = "VT_DISPATCH", "getVT(test) = " & getVT(test))
Call ok(Me is Test, "Me is not Test")
Const c1 = 1, c2 = 2
Call ok(c1 = 1, "c1 = " & c1)
Call ok(getVT(c1) = "VT_I2", "getVT(c1) = " & getVT(c1))
if false then Const conststr = "str"
Call ok(conststr = "str", "conststr = " & conststr)
Call ok(getVT(conststr) = "VT_BSTR", "getVT(conststr) = " & getVT(conststr))
Call ok(conststr = "str", "conststr = " & conststr)
Sub ConstTestSub
Const funcconst = 1
Call ok(c1 = 1, "c1 = " & c1)
Call ok(funcconst = 1, "funcconst = " & funcconst)
End Sub
Call ConstTestSub
Dim funcconst
' Property may be used as an identifier (although it's a keyword)
Sub TestProperty
Dim Property
PROPERTY = true
Call ok(property, "property = " & property)
for property = 1 to 2
next
End Sub
Call TestProperty
Class Property
Public Sub Property()
End Sub
Sub Test(byref property)
End Sub
End Class
Class Property2
Function Property()
End Function
Sub Test(property)
End Sub
Sub Test2(byval property)
End Sub
End Class
reportSuccess()