@@ -14,6 +14,20 @@ class BaseTestCase: XCTestCase {
1414 static let timeout : TimeInterval = 60.0
1515 let timeout : TimeInterval = 60.0
1616
17+ static let className = " TestObject "
18+
19+ enum TestField : String {
20+ case integer = " testInteger "
21+ case double = " testDouble "
22+ case boolean = " testBoolean "
23+ case string = " testString "
24+ case array = " testArray "
25+ case dict = " testDictionary "
26+ case date = " testDate "
27+ case data = " testData "
28+ case object = " testObject "
29+ }
30+
1731 static var uuid : String {
1832 return UUID ( ) . uuidString. replacingOccurrences ( of: " - " , with: " " )
1933 }
@@ -143,3 +157,114 @@ extension BaseTestCase {
143157 application. setWithIdentifier ( appInfo. id, key: appInfo. key)
144158 }
145159}
160+
161+
162+
163+ enum LCTestError : String , Error {
164+
165+ case valueNotExist
166+ case typeNotMatch
167+ }
168+
169+ extension LCTestError : LocalizedError {
170+ var errorDescription : String ? {
171+ return self . rawValue
172+ }
173+ }
174+
175+ extension BaseTestCase {
176+
177+ static func valueIsEqual< T: Equatable > ( first: T , second: T ) -> Bool {
178+ return first == second
179+ }
180+
181+ static func getValue< T> ( from object: LCObject , key field: String ) throws -> T {
182+ let value = object. object ( forKey: field)
183+ guard let value = value else {
184+ throw LCTestError . valueNotExist
185+ }
186+
187+ guard let value = value as? T else {
188+ throw LCTestError . typeNotMatch
189+ }
190+ return value
191+ }
192+
193+ static func verifyLCObjectValues( object: LCObject , needVerifyFields: [ TestField : Any ] ) {
194+ // 这里类型一致需要开发者自己控制,如果不一致不要调用该方法,自己手动校验
195+ for (field, value) in needVerifyFields {
196+ switch field {
197+ case . integer:
198+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! Int )
199+ case . double:
200+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! Double )
201+ case . boolean:
202+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! Bool )
203+ case . string:
204+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! String )
205+ case . array:
206+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! NSArray )
207+ case . dict:
208+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! NSDictionary )
209+ case . date:
210+ if let verifyValue = value as? Date ,
211+ let realValue: Date = try ? getValue ( from: object, key: field. rawValue) {
212+ let interval = verifyValue. timeIntervalSince ( realValue)
213+ XCTAssert ( fabs ( interval) < 0.01 , " 字段 \( field. rawValue) 发生错误,需要校验的值为: \( verifyValue) ,实际值却是: \( realValue) " )
214+ } else {
215+ XCTFail ( " 字段 \( field. rawValue) 类型错误 " )
216+ }
217+ case . data:
218+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! Data )
219+ case . object:
220+ verifyLCObjectFieldValue ( object: object, fieldName: field. rawValue, value: value as! LCObject )
221+ }
222+
223+ }
224+ }
225+
226+
227+ static func verifyLCObjectValues( objectID: String , needVerifyFields: [ TestField : Any ] , className: String = LCObjectTestCase . className) {
228+ let object = LCObject . init ( className: className, objectId: objectID)
229+ XCTAssert ( object. fetch ( ) )
230+ verifyLCObjectValues ( object: object, needVerifyFields: needVerifyFields)
231+ }
232+
233+ static func verifyLCObjectFieldValue< T : Equatable > ( object: LCObject , fieldName: String , value: T ) {
234+
235+ do {
236+ let realValue : T = try getValue ( from: object, key: fieldName)
237+ XCTAssert ( value == realValue, " 字段 \( fieldName) 发生错误,需要校验的值为: \( value) ,实际值却是: \( realValue) " )
238+ } catch {
239+ XCTFail ( " 字段 \( fieldName) 发生错误: " + error. localizedDescription)
240+ }
241+ }
242+
243+ static func createLCObject( fields: [ TestField : Any ] , save: Bool = true , className: String = LCObjectTestCase . className) -> LCObject {
244+ let object = LCObject . init ( className: className)
245+ for (field, value) in fields {
246+ object. setObject ( value, forKey: field. rawValue)
247+ }
248+ if save {
249+ XCTAssert ( object. save ( ) )
250+ XCTAssertNotNil ( object. objectId)
251+ }
252+ return object
253+ }
254+
255+ // @inline(__always)
256+ // func setLCObjectFieldValues(object: LCObject, fields: [TestField: Any]){
257+ // for (field, value) in fields {
258+ // object.setObject(value, forKey: field.rawValue)
259+ // }
260+ // }
261+
262+ static func updateLCObject( objectID: String , className: String = LCObjectTestCase . className, updateAction: ( ( LCObject ) -> ( ) ) ) {
263+ let object = LCObject . init ( className: className, objectId: objectID)
264+ updateAction ( object)
265+ XCTAssert ( object. save ( ) )
266+ }
267+
268+
269+ }
270+
0 commit comments