459 lines
18 KiB
Swift
459 lines
18 KiB
Swift
/*
|
|
* Copyright 2010-2018 JetBrains s.r.o.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
import Foundation
|
|
import Values
|
|
|
|
// -------- Tests --------
|
|
|
|
func testVals() throws {
|
|
print("Values from Swift")
|
|
let dbl = ValuesKt.dbl
|
|
let flt = ValuesKt.flt
|
|
let int = ValuesKt.integer
|
|
let long = ValuesKt.longInt
|
|
|
|
print(dbl)
|
|
print(flt)
|
|
print(int)
|
|
print(long)
|
|
|
|
try assertEquals(actual: dbl, expected: 3.14 as Double, "Double value isn't equal.")
|
|
try assertEquals(actual: flt, expected: 2.73 as Float, "Float value isn't equal.")
|
|
try assertEquals(actual: int, expected: 42)
|
|
try assertEquals(actual: long, expected: 1984)
|
|
}
|
|
|
|
func testVars() throws {
|
|
print("Variables from Swift")
|
|
var intVar = ValuesKt.intVar
|
|
var strVar = ValuesKt.str
|
|
var strAsId = ValuesKt.strAsAny
|
|
|
|
print(intVar)
|
|
print(strVar)
|
|
print(strAsId)
|
|
|
|
try assertEquals(actual: intVar, expected: 451)
|
|
try assertEquals(actual: strVar, expected: "Kotlin String")
|
|
try assertEquals(actual: strAsId as! String, expected: "Kotlin String as Any")
|
|
|
|
strAsId = "Swift str"
|
|
ValuesKt.strAsAny = strAsId
|
|
print(ValuesKt.strAsAny)
|
|
try assertEquals(actual: ValuesKt.strAsAny as! String, expected: strAsId as! String)
|
|
|
|
// property with custom getter/setter backed by the Kotlin's var
|
|
var intProp : Int32 {
|
|
get {
|
|
return ValuesKt.intVar * 2
|
|
}
|
|
set(value) {
|
|
ValuesKt.intVar = 123 + value
|
|
}
|
|
}
|
|
intProp += 10
|
|
print(intProp)
|
|
print(ValuesKt.intVar)
|
|
try assertEquals(actual: ValuesKt.intVar * 2, expected: intProp, "Property backed by var")
|
|
}
|
|
|
|
func testDoubles() throws {
|
|
print("Doubles in Swift")
|
|
let minDouble = ValuesKt.minDoubleVal as! Double
|
|
let maxDouble = ValuesKt.maxDoubleVal as! NSNumber
|
|
|
|
print(minDouble)
|
|
print(maxDouble)
|
|
print(ValuesKt.nanDoubleVal)
|
|
print(ValuesKt.nanFloatVal)
|
|
print(ValuesKt.infDoubleVal)
|
|
print(ValuesKt.infFloatVal)
|
|
|
|
try assertEquals(actual: minDouble, expected: Double.leastNonzeroMagnitude, "Min double")
|
|
try assertEquals(actual: maxDouble, expected: Double.greatestFiniteMagnitude as NSNumber, "Max double")
|
|
try assertTrue(ValuesKt.nanDoubleVal.isNaN, "NaN double")
|
|
try assertTrue(ValuesKt.nanFloatVal.isNaN, "NaN float")
|
|
try assertEquals(actual: ValuesKt.infDoubleVal, expected: Double.infinity, "Inf double")
|
|
try assertEquals(actual: ValuesKt.infFloatVal, expected: -Float.infinity, "-Inf float")
|
|
}
|
|
|
|
func testNumbers() throws {
|
|
try assertEquals(actual: KotlinBoolean(value: true).boolValue, expected: true)
|
|
try assertEquals(actual: KotlinBoolean(value: false).intValue, expected: 0)
|
|
try assertEquals(actual: KotlinBoolean(value: true), expected: true)
|
|
try assertFalse(KotlinBoolean(value: false) as! Bool)
|
|
|
|
try assertEquals(actual: KotlinByte(value: -1).int8Value, expected: -1)
|
|
try assertEquals(actual: KotlinByte(value: -1).int32Value, expected: -1)
|
|
try assertEquals(actual: KotlinByte(value: -1).doubleValue, expected: -1.0)
|
|
try assertEquals(actual: KotlinByte(value: -1), expected: NSNumber(value: Int64(-1)))
|
|
try assertFalse(KotlinByte(value: -1) == NSNumber(value: -1.5))
|
|
try assertEquals(actual: KotlinByte(value: -1), expected: -1)
|
|
try assertTrue(KotlinByte(value: -1) == -1)
|
|
try assertFalse(KotlinByte(value: -1) == 1)
|
|
try assertEquals(actual: KotlinByte(value: -1) as! Int32, expected: -1)
|
|
|
|
try assertEquals(actual: KotlinShort(value: 111).int16Value, expected: 111)
|
|
try assertEquals(actual: KotlinShort(value: -15) as! Int16, expected: -15)
|
|
try assertEquals(actual: KotlinShort(value: 47), expected: 47)
|
|
|
|
try assertEquals(actual: KotlinInt(value: 99).int32Value, expected: 99)
|
|
try assertEquals(actual: KotlinInt(value: -1) as! Int32, expected: -1)
|
|
try assertEquals(actual: KotlinInt(value: 72), expected: 72)
|
|
|
|
try assertEquals(actual: KotlinLong(value: 65).int64Value, expected: 65)
|
|
try assertEquals(actual: KotlinLong(value: 10000000000) as! Int64, expected: 10000000000)
|
|
try assertEquals(actual: KotlinLong(value: 8), expected: 8)
|
|
|
|
try assertEquals(actual: KotlinUByte(value: 17).uint8Value, expected: 17)
|
|
try assertEquals(actual: KotlinUByte(value: 42) as! UInt8, expected: 42)
|
|
try assertEquals(actual: 88, expected: KotlinUByte(value: 88))
|
|
|
|
try assertEquals(actual: KotlinUShort(value: 40000).uint16Value, expected: 40000)
|
|
try assertEquals(actual: KotlinUShort(value: 1) as! UInt16, expected: UInt16(1))
|
|
try assertEquals(actual: KotlinUShort(value: 65000), expected: 65000)
|
|
|
|
try assertEquals(actual: KotlinUInt(value: 3).uint32Value, expected: 3)
|
|
try assertEquals(actual: KotlinUInt(value: UInt32.max) as! UInt32, expected: UInt32.max)
|
|
try assertEquals(actual: KotlinUInt(value: 2), expected: 2)
|
|
|
|
try assertEquals(actual: KotlinULong(value: 55).uint64Value, expected: 55)
|
|
try assertEquals(actual: KotlinULong(value: 0) as! UInt64, expected: 0)
|
|
try assertEquals(actual: KotlinULong(value: 7), expected: 7)
|
|
|
|
try assertEquals(actual: KotlinFloat(value: 1.0).floatValue, expected: 1.0)
|
|
try assertEquals(actual: KotlinFloat(value: 22.0) as! Float, expected: 22)
|
|
try assertEquals(actual: KotlinFloat(value: 41.0), expected: 41)
|
|
try assertEquals(actual: KotlinFloat(value: -5.5), expected: -5.5)
|
|
|
|
try assertEquals(actual: KotlinDouble(value: 0.5).doubleValue, expected: 0.5)
|
|
try assertEquals(actual: KotlinDouble(value: 45.0) as! Double, expected: 45)
|
|
try assertEquals(actual: KotlinDouble(value: 89.0), expected: 89)
|
|
try assertEquals(actual: KotlinDouble(value: -3.7), expected: -3.7)
|
|
|
|
ValuesKt.ensureEqualBooleans(actual: KotlinBoolean(value: true), expected: true)
|
|
ValuesKt.ensureEqualBooleans(actual: false, expected: false)
|
|
|
|
ValuesKt.ensureEqualBytes(actual: KotlinByte(value: 42), expected: 42)
|
|
ValuesKt.ensureEqualBytes(actual: -11, expected: -11)
|
|
|
|
ValuesKt.ensureEqualShorts(actual: KotlinShort(value: 256), expected: 256)
|
|
ValuesKt.ensureEqualShorts(actual: -1, expected: -1)
|
|
|
|
ValuesKt.ensureEqualInts(actual: KotlinInt(value: 100000), expected: 100000)
|
|
ValuesKt.ensureEqualInts(actual: -7, expected: -7)
|
|
|
|
ValuesKt.ensureEqualLongs(actual: KotlinLong(value: Int64.max), expected: Int64.max)
|
|
ValuesKt.ensureEqualLongs(actual: 17, expected: 17)
|
|
|
|
ValuesKt.ensureEqualUBytes(actual: KotlinUByte(value: 6), expected: 6)
|
|
ValuesKt.ensureEqualUBytes(actual: 255, expected: 255)
|
|
|
|
ValuesKt.ensureEqualUShorts(actual: KotlinUShort(value: 300), expected: 300)
|
|
ValuesKt.ensureEqualUShorts(actual: 65535, expected: UInt16.max)
|
|
|
|
ValuesKt.ensureEqualUInts(actual: KotlinUInt(value: 70000), expected: 70000)
|
|
ValuesKt.ensureEqualUInts(actual: 48, expected: 48)
|
|
|
|
ValuesKt.ensureEqualULongs(actual: KotlinULong(value: UInt64.max), expected: UInt64.max)
|
|
ValuesKt.ensureEqualULongs(actual: 39, expected: 39)
|
|
|
|
ValuesKt.ensureEqualFloats(actual: KotlinFloat(value: 36.6), expected: 36.6)
|
|
ValuesKt.ensureEqualFloats(actual: 49.5, expected: 49.5)
|
|
ValuesKt.ensureEqualFloats(actual: 18, expected: 18.0)
|
|
|
|
ValuesKt.ensureEqualDoubles(actual: KotlinDouble(value: 12.34), expected: 12.34)
|
|
ValuesKt.ensureEqualDoubles(actual: 56.78, expected: 56.78)
|
|
ValuesKt.ensureEqualDoubles(actual: 3, expected: 3)
|
|
|
|
func checkBox<T: Equatable, B : NSObject>(_ value: T, _ boxFunction: (T) -> B?) throws {
|
|
let box = boxFunction(value)!
|
|
try assertEquals(actual: box as! T, expected: value)
|
|
print(type(of: box))
|
|
print(B.self)
|
|
try assertTrue(box.isKind(of: B.self))
|
|
}
|
|
|
|
try checkBox(true, ValuesKt.box)
|
|
try checkBox(Int8(-1), ValuesKt.box)
|
|
try checkBox(Int16(-2), ValuesKt.box)
|
|
try checkBox(Int32(-3), ValuesKt.box)
|
|
try checkBox(Int64(-4), ValuesKt.box)
|
|
try checkBox(UInt8(5), ValuesKt.box)
|
|
try checkBox(UInt16(6), ValuesKt.box)
|
|
try checkBox(UInt32(7), ValuesKt.box)
|
|
try checkBox(UInt64(8), ValuesKt.box)
|
|
try checkBox(Float(8.7), ValuesKt.box)
|
|
try checkBox(Double(9.4), ValuesKt.box)
|
|
}
|
|
|
|
func testLists() throws {
|
|
let numbersList = ValuesKt.numbersList
|
|
let gold = [1, 2, 13]
|
|
for i in 0..<gold.count {
|
|
try assertEquals(actual: gold[i], expected: Int(numbersList[i] as! NSNumber), "Numbers list")
|
|
}
|
|
|
|
let anyList = ValuesKt.anyList
|
|
for i in anyList {
|
|
print(i)
|
|
}
|
|
// try assertEquals(actual: gold, expected: anyList, "Numbers list")
|
|
}
|
|
|
|
func testLazyVal() throws {
|
|
let lazyVal = ValuesKt.lazyVal
|
|
print(lazyVal)
|
|
try assertEquals(actual: lazyVal, expected: "Lazily initialized string", "lazy value")
|
|
}
|
|
|
|
let goldenArray = ["Delegated", "global", "array", "property"]
|
|
|
|
func testDelegatedProp() throws {
|
|
let delegatedGlobalArray = ValuesKt.delegatedGlobalArray
|
|
guard Int(delegatedGlobalArray.size) == goldenArray.count else {
|
|
throw TestError.assertFailed("Size differs")
|
|
}
|
|
for i in 0..<delegatedGlobalArray.size {
|
|
print(delegatedGlobalArray.get(index: i)!)
|
|
}
|
|
}
|
|
|
|
func testGetterDelegate() throws {
|
|
let delegatedList = ValuesKt.delegatedList
|
|
guard delegatedList.count == goldenArray.count else {
|
|
throw TestError.assertFailed("Size differs")
|
|
}
|
|
for val in delegatedList {
|
|
print(val)
|
|
}
|
|
}
|
|
|
|
func testNulls() throws {
|
|
let nilVal : Any? = ValuesKt.nullVal
|
|
try assertTrue(nilVal == nil, "Null value")
|
|
|
|
ValuesKt.nullVar = nil
|
|
var nilVar : Any? = ValuesKt.nullVar
|
|
try assertTrue(nilVar == nil, "Null variable")
|
|
}
|
|
|
|
func testAnyVar() throws {
|
|
let anyVar : Any = ValuesKt.anyValue
|
|
print(anyVar)
|
|
if let str = anyVar as? String {
|
|
print(str)
|
|
try assertEquals(actual: str, expected: "Str")
|
|
} else {
|
|
throw TestError.assertFailed("Incorrect type passed from Any")
|
|
}
|
|
}
|
|
|
|
func testFunctions() throws {
|
|
let _: Any? = ValuesKt.emptyFun()
|
|
|
|
let str = ValuesKt.strFun()
|
|
try assertEquals(actual: str, expected: "fooStr")
|
|
|
|
try assertEquals(actual: ValuesKt.argsFun(i: 10, l: 20, d: 3.5, s: "res") as! String,
|
|
expected: "res10203.5")
|
|
}
|
|
|
|
func testFuncType() throws {
|
|
let s = "str"
|
|
let fFunc: () -> String = { return s }
|
|
try assertEquals(actual: ValuesKt.funArgument(foo: fFunc), expected: s, "Using function type arguments failed")
|
|
}
|
|
|
|
func testGenericsFoo() throws {
|
|
let fun = { (i: Int) -> String in return "S \(i)" }
|
|
// wrap lambda to workaround issue with type conversion inability:
|
|
// (Int) -> String can't be cast to (Any?) -> Any?
|
|
let wrapper = { (t: Any?) -> Any? in return fun(t as! Int) }
|
|
let res = ValuesKt.genericFoo(t: 42, foo: wrapper)
|
|
try assertEquals(actual: res as! String, expected: "S 42")
|
|
}
|
|
|
|
func testVararg() throws {
|
|
let ktArray = KotlinArray(size: 3, init: { (_) -> Int in return 42 })
|
|
let arr: [Int] = ValuesKt.varargToList(args: ktArray) as! [Int]
|
|
try assertEquals(actual: arr, expected: [42, 42, 42])
|
|
}
|
|
|
|
func testStrExtFun() throws {
|
|
try assertEquals(actual: ValuesKt.subExt("String", i: 2), expected: "r")
|
|
try assertEquals(actual: ValuesKt.subExt("A", i: 2), expected: "nothing")
|
|
}
|
|
|
|
func testAnyToString() throws {
|
|
try assertEquals(actual: ValuesKt.toString(nil), expected: "null")
|
|
try assertEquals(actual: ValuesKt.toString(42), expected: "42")
|
|
}
|
|
|
|
func testAnyPrint() throws {
|
|
print("BEGIN")
|
|
ValuesKt.print(nil)
|
|
ValuesKt.print("Print")
|
|
ValuesKt.print(123456789)
|
|
ValuesKt.print(3.14)
|
|
ValuesKt.print([3, 2, 1])
|
|
print("END")
|
|
}
|
|
|
|
func testCharExtensions() throws {
|
|
try assertTrue(ValuesKt.isA(ValuesKt.boxChar(65)))
|
|
try assertFalse(ValuesKt.isA(ValuesKt.boxChar(66)))
|
|
}
|
|
|
|
func testLambda() throws {
|
|
try assertEquals(actual: ValuesKt.sumLambda(3, 4), expected: 7)
|
|
}
|
|
|
|
// -------- Tests for classes and interfaces -------
|
|
class ValIEmptyExt : I {
|
|
func iFun() -> String {
|
|
return "ValIEmptyExt::iFun"
|
|
}
|
|
}
|
|
|
|
class ValIExt : I {
|
|
func iFun() -> String {
|
|
return "ValIExt::iFun"
|
|
}
|
|
}
|
|
|
|
func testInterfaceExtension() throws {
|
|
try assertEquals(actual: ValIEmptyExt().iFun(), expected: "ValIEmptyExt::iFun")
|
|
try assertEquals(actual: ValIExt().iFun(), expected: "ValIExt::iFun")
|
|
}
|
|
|
|
func testClassInstances() throws {
|
|
try assertEquals(actual: OpenClassI().iFun(), expected: "OpenClassI::iFun")
|
|
try assertEquals(actual: DefaultInterfaceExt().iFun(), expected: "I::iFun")
|
|
try assertEquals(actual: FinalClassExtOpen().iFun(), expected: "FinalClassExtOpen::iFun")
|
|
try assertEquals(actual: MultiExtClass().iFun(), expected: "PI::iFun")
|
|
try assertEquals(actual: MultiExtClass().piFun() as! Int, expected: 42)
|
|
try assertEquals(actual: ConstrClass(i: 1, s: "str", a: "Any").iFun(), expected: "OpenClassI::iFun")
|
|
try assertEquals(actual: ExtConstrClass(i: 123).iFun(), expected: "ExtConstrClass::iFun::123-String-AnyS")
|
|
}
|
|
|
|
func testEnum() throws {
|
|
try assertEquals(actual: ValuesKt.passEnum().enumValue, expected: 42)
|
|
try assertEquals(actual: ValuesKt.passEnum().name, expected: "ANSWER")
|
|
ValuesKt.receiveEnum(e: 1)
|
|
}
|
|
|
|
func testDataClass() throws {
|
|
let f = "1"
|
|
let s = "2"
|
|
let t = "3"
|
|
|
|
let tripleVal = TripleVals(first: f, second: s, third: t)
|
|
try assertEquals(actual: tripleVal.first as! String, expected: f, "Data class' value")
|
|
try assertEquals(actual: tripleVal.component2() as! String, expected: s, "Data class' component")
|
|
print(tripleVal)
|
|
try assertEquals(actual: String(describing: tripleVal), expected: "TripleVals(first=\(f), second=\(s), third=\(t))")
|
|
|
|
let tripleVar = TripleVars(first: f, second: s, third: t)
|
|
try assertEquals(actual: tripleVar.first as! String, expected: f, "Data class' value")
|
|
try assertEquals(actual: tripleVar.component2() as! String, expected: s, "Data class' component")
|
|
print(tripleVar)
|
|
try assertEquals(actual: String(describing: tripleVar), expected: "[\(f), \(s), \(t)]")
|
|
|
|
tripleVar.first = t
|
|
tripleVar.second = f
|
|
tripleVar.third = s
|
|
try assertEquals(actual: tripleVar.component2() as! String, expected: f, "Data class' component")
|
|
try assertEquals(actual: String(describing: tripleVar), expected: "[\(t), \(f), \(s)]")
|
|
}
|
|
|
|
func testCompanionObj() throws {
|
|
try assertEquals(actual: WithCompanionAndObject.Companion().str, expected: "String")
|
|
try assertEquals(actual: ValuesKt.getCompanionObject().str, expected: "String")
|
|
|
|
let namedFromCompanion = ValuesKt.getCompanionObject().named
|
|
let named = ValuesKt.getNamedObject()
|
|
try assertTrue(named === namedFromCompanion, "Should be the same Named object")
|
|
|
|
try assertEquals(actual: ValuesKt.getNamedObjectInterface().iFun(), expected: named.iFun(), "Named object's method")
|
|
}
|
|
|
|
func testInlineClasses() throws {
|
|
let ic1: Int32 = 42
|
|
let ic1N = ValuesKt.box(ic1: 17)
|
|
let ic2 = "foo"
|
|
let ic2N = "bar"
|
|
let ic3 = TripleVals(first: 1, second: 2, third: 3)
|
|
let ic3N = ValuesKt.box(ic3: nil)
|
|
|
|
try assertEquals(
|
|
actual: ValuesKt.concatenateInlineClassValues(ic1: ic1, ic1N: ic1N, ic2: ic2, ic2N: ic2N, ic3: ic3, ic3N: ic3N),
|
|
expected: "42 17 foo bar TripleVals(first=1, second=2, third=3) null"
|
|
)
|
|
|
|
try assertEquals(
|
|
actual: ValuesKt.concatenateInlineClassValues(ic1: ic1, ic1N: nil, ic2: ic2, ic2N: nil, ic3: nil, ic3N: nil),
|
|
expected: "42 null foo null null null"
|
|
)
|
|
|
|
try assertEquals(actual: ValuesKt.getValue1(ic1), expected: 42)
|
|
try assertEquals(actual: ValuesKt.getValueOrNull1(ic1N) as! Int, expected: 17)
|
|
|
|
try assertEquals(actual: ValuesKt.getValue2(ic2), expected: "foo")
|
|
try assertEquals(actual: ValuesKt.getValueOrNull2(ic2N), expected: "bar")
|
|
|
|
try assertEquals(actual: ValuesKt.getValue3(ic3), expected: ic3)
|
|
try assertEquals(actual: ValuesKt.getValueOrNull3(ic3N), expected: nil)
|
|
}
|
|
|
|
// -------- Execution of the test --------
|
|
|
|
class ValuesTests : TestProvider {
|
|
var tests: [TestCase] = []
|
|
|
|
init() {
|
|
providers.append(self)
|
|
tests = [
|
|
TestCase(name: "TestValues", method: withAutorelease(testVals)),
|
|
TestCase(name: "TestVars", method: withAutorelease(testVars)),
|
|
TestCase(name: "TestDoubles", method: withAutorelease(testDoubles)),
|
|
TestCase(name: "TestNumbers", method: withAutorelease(testNumbers)),
|
|
TestCase(name: "TestLists", method: withAutorelease(testLists)),
|
|
TestCase(name: "TestLazyValues", method: withAutorelease(testLazyVal)),
|
|
TestCase(name: "TestDelegatedProperties", method: withAutorelease(testDelegatedProp)),
|
|
TestCase(name: "TestGetterDelegate", method: withAutorelease(testGetterDelegate)),
|
|
TestCase(name: "TestNulls", method: withAutorelease(testNulls)),
|
|
TestCase(name: "TestAnyVar", method: withAutorelease(testAnyVar)),
|
|
TestCase(name: "TestFunctions", method: withAutorelease(testFunctions)),
|
|
TestCase(name: "TestFuncType", method: withAutorelease(testFuncType)),
|
|
TestCase(name: "TestGenericsFoo", method: withAutorelease(testGenericsFoo)),
|
|
TestCase(name: "TestVararg", method: withAutorelease(testVararg)),
|
|
TestCase(name: "TestStringExtension", method: withAutorelease(testStrExtFun)),
|
|
TestCase(name: "TestAnyToString", method: withAutorelease(testAnyToString)),
|
|
TestCase(name: "TestAnyPrint", method: withAutorelease(testAnyPrint)),
|
|
TestCase(name: "TestCharExtensions", method: withAutorelease(testCharExtensions)),
|
|
TestCase(name: "TestLambda", method: withAutorelease(testLambda)),
|
|
TestCase(name: "TestInterfaceExtension", method: withAutorelease(testInterfaceExtension)),
|
|
TestCase(name: "TestClassInstances", method: withAutorelease(testClassInstances)),
|
|
TestCase(name: "TestEnum", method: withAutorelease(testEnum)),
|
|
TestCase(name: "TestDataClass", method: withAutorelease(testDataClass)),
|
|
TestCase(name: "TestCompanionObj", method: withAutorelease(testCompanionObj)),
|
|
TestCase(name: "TestInlineClasses", method: withAutorelease(testInlineClasses)),
|
|
]
|
|
}
|
|
}
|