master

SwiftyJSON/SwiftyJSON

Last updated at: 29/12/2023 09:36

PerformanceTests.swift

TLDR

This file contains performance tests for the SwiftyJSON library. It includes tests for initializing JSON objects, accessing object methods, accessing array methods, accessing dictionary methods, accessing raw string methods, and accessing large dictionary methods.

Methods

testInitPerformance

This method tests the performance of initializing JSON objects. It measures the time it takes to create JSON objects from test data and asserts that the resulting objects are not equal to the null value.

testObjectMethodPerformance

This method tests the performance of accessing object methods. It measures the time it takes to access the object property of a JSON object and asserts that the resulting object is not nil.

testArrayMethodPerformance

This method tests the performance of accessing array methods. It measures the time it takes to access the array property of a JSON object and asserts that the resulting array is not empty.

testDictionaryMethodPerformance

This method tests the performance of accessing dictionary methods. It measures the time it takes to access the dictionary property of a JSON object and asserts that the resulting dictionary is not empty.

testRawStringMethodPerformance

This method tests the performance of accessing raw string methods. It measures the time it takes to call the rawString() method on a JSON object and asserts that the resulting string is not nil.

testLargeDictionaryMethodPerformance

This method tests the performance of accessing large dictionary methods. It creates a large dictionary of JSON objects and measures the time it takes to access the dictionary property of the JSON object and asserts that the resulting dictionary has the correct count.

//  PerformanceTests.swift
//
//  Copyright (c) 2014 - 2017 Pinglin Tang
//
//  Permission is hereby granted, free of charge, to any person obtaining a copy
//  of this software and associated documentation files (the "Software"), to deal
//  in the Software without restriction, including without limitation the rights
//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//  copies of the Software, and to permit persons to whom the Software is
//  furnished to do so, subject to the following conditions:
//
//  The above copyright notice and this permission notice shall be included in
//  all copies or substantial portions of the Software.
//
//  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
//  THE SOFTWARE.

import XCTest
import SwiftyJSON

class PerformanceTests: XCTestCase {

    var testData: Data!

    override func setUp() {
        super.setUp()

        if let file = Bundle(for: PerformanceTests.self).path(forResource: "Tests", ofType: "json") {
            self.testData = try? Data(contentsOf: URL(fileURLWithPath: file))
        } else {
            XCTFail("Can't find the test JSON file")
        }
    }

    override func tearDown() {
        // Put teardown code here. This method is called after the invocation of each test method in the class.
        super.tearDown()
    }

    func testInitPerformance() {
        self.measure {
            for _ in 1...100 {
                guard let json = try? JSON(data: self.testData) else {
                    XCTFail("Unable to parse testData")
                    return
                }
                XCTAssertTrue(json != JSON.null)
            }
        }
    }

    func testObjectMethodPerformance() {
        guard let json = try? JSON(data: self.testData) else {
            XCTFail("Unable to parse testData")
            return
        }
        self.measure {
            for _ in 1...100 {
                let object: Any? = json.object
                XCTAssertTrue(object != nil)
            }
        }
    }

    func testArrayMethodPerformance() {
        guard let json = try? JSON(data: self.testData) else {
            XCTFail("Unable to parse testData")
            return
        }
        self.measure {
            for _ in 1...100 {
                autoreleasepool {
                    if let array = json.array {
                        XCTAssertTrue(array.count > 0)
                    }
                }
            }
        }
    }

    func testDictionaryMethodPerformance() {
        guard let json = try? JSON(data: self.testData)[0] else {
            XCTFail("Unable to parse testData")
            return
        }
        self.measure {
            for _ in 1...100 {
                autoreleasepool {
                    if let dictionary = json.dictionary {
                        XCTAssertTrue(dictionary.count > 0)
                    }
                }
            }
        }
    }

    func testRawStringMethodPerformance() {
        guard let json = try? JSON(data: self.testData) else {
            XCTFail("Unable to parse testData")
            return
        }
        self.measure {
            for _ in 1...100 {
                autoreleasepool {
                    let string = json.rawString()
                    XCTAssertTrue(string != nil)
                }
            }
        }
    }

    func testLargeDictionaryMethodPerformance() {
        var data: [String: JSON] = [:]
        (0...100000).forEach { n in
            data["\(n)"] = JSON([
                "name": "item\(n)",
                "id": n
                ])
        }
        let json = JSON(data)

        self.measure {
            autoreleasepool {
                if let dictionary = json.dictionary {
                    XCTAssertTrue(dictionary.count == 100001)
                } else {
                    XCTFail("dictionary should not be nil")
                }
            }
        }
    }
}