Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8c0a82c2f0 | ||
|
|
124c1cc145 |
+1
-1
@@ -1,4 +1,4 @@
|
||||
github "SwiftyJSON/SwiftyJSON" "4.2.0"
|
||||
github "SwiftyJSON/SwiftyJSON" "5.0.0"
|
||||
github "acheronfail/MASShortcut" "2.3.6-custom"
|
||||
github "emaloney/CleanroomLogger" "6.0.2"
|
||||
github "sindresorhus/LaunchAtLogin" "v2.5.0"
|
||||
|
||||
+1
-1
@@ -1,5 +1,5 @@
|
||||
language: objective-c
|
||||
osx_image: xcode10
|
||||
osx_image: xcode10.2
|
||||
xcode_sdk: iphonesimulator12.0
|
||||
script:
|
||||
- set -o pipefail
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
/* End PBXCopyFilesBuildPhase section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
04294C501BE5A9DE00D0397E /* Playground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Playground.playground; sourceTree = "<group>"; };
|
||||
04294C501BE5A9DE00D0397E /* Playground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Playground.playground; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.swift; };
|
||||
04733F511D92E6ED002E3A99 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A82A1C1919D926B8009A653D /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A82A1C1D19D926B8009A653D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
@@ -124,19 +124,19 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0700;
|
||||
LastUpgradeCheck = 0930;
|
||||
LastUpgradeCheck = 1020;
|
||||
ORGANIZATIONNAME = swiftyjson;
|
||||
TargetAttributes = {
|
||||
A82A1C1819D926B8009A653D = {
|
||||
CreatedOnToolsVersion = 6.0.1;
|
||||
LastSwiftMigration = 0930;
|
||||
LastSwiftMigration = 1020;
|
||||
ProvisioningStyle = Manual;
|
||||
};
|
||||
};
|
||||
};
|
||||
buildConfigurationList = A82A1C1419D926B8009A653D /* Build configuration list for PBXProject "Example" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
@@ -313,8 +313,7 @@
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.swiftyjson.$(PRODUCT_NAME:rfc1034identifier)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -329,8 +328,7 @@
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.swiftyjson.$(PRODUCT_NAME:rfc1034identifier)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
|
||||
@@ -28,7 +28,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
|
||||
|
||||
var window: UIWindow?
|
||||
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
|
||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
|
||||
|
||||
let navigationController = self.window?.rootViewController as! UINavigationController
|
||||
let viewController = navigationController.topViewController as! ViewController
|
||||
|
||||
@@ -29,7 +29,6 @@ let jsonString = String(data: jsonData!, encoding: .utf8)
|
||||
### Initialization
|
||||
|
||||
*/
|
||||
import SwiftyJSON
|
||||
|
||||
let json1 = try? JSON(data: jsonData!)
|
||||
/*:
|
||||
|
||||
+14
-1
@@ -1,4 +1,17 @@
|
||||
// swift-tools-version:5.0
|
||||
import PackageDescription
|
||||
|
||||
let package = Package(
|
||||
name: "SwiftyJSON")
|
||||
name: "SwiftyJSON",
|
||||
platforms: [
|
||||
.macOS(.v10_10), .iOS(.v8), .tvOS(.v9), .watchOS(.v3)
|
||||
],
|
||||
products: [
|
||||
.library(name: "SwiftyJSON", targets: ["SwiftyJSON"])
|
||||
],
|
||||
targets: [
|
||||
.target(name: "SwiftyJSON", dependencies: []),
|
||||
.testTarget(name: "SwiftJSONTests", dependencies: ["SwiftyJSON"])
|
||||
],
|
||||
swiftLanguageVersions: [.v5]
|
||||
)
|
||||
|
||||
+17
-4
@@ -1,9 +1,15 @@
|
||||
# SwiftyJSON
|
||||
|
||||
[](https://travis-ci.org/SwiftyJSON/SwiftyJSON) [](https://github.com/Carthage/Carthage)  
|
||||
[](https://github.com/Carthage/Carthage)   [](https://houndci.com)
|
||||
|
||||
SwiftyJSON makes it easy to deal with JSON data in Swift.
|
||||
|
||||
Platform | Build Status
|
||||
---------| --------------|
|
||||
*OS | [](https://travis-ci.org/SwiftyJSON/SwiftyJSON) |
|
||||
[Linux](https://github.com/IBM-Swift/SwiftyJSON) | [](https://travis-ci.org/IBM-Swift/SwiftyJSON) |
|
||||
|
||||
|
||||
1. [Why is the typical JSON handling in Swift NOT good](#why-is-the-typical-json-handling-in-swift-not-good)
|
||||
2. [Requirements](#requirements)
|
||||
3. [Integration](#integration)
|
||||
@@ -20,6 +26,7 @@ SwiftyJSON makes it easy to deal with JSON data in Swift.
|
||||
- [Merging](#merging)
|
||||
5. [Work with Alamofire](#work-with-alamofire)
|
||||
6. [Work with Moya](#work-with-moya)
|
||||
7. [SwiftyJSON Model Generator](#swiftyjson-model-generator)
|
||||
|
||||
> [中文介绍](http://tangplin.github.io/swiftyjson/)
|
||||
|
||||
@@ -66,11 +73,12 @@ And don't worry about the Optional Wrapping thing. It's done for you automatical
|
||||
|
||||
```swift
|
||||
let json = JSON(data: dataFromNetworking)
|
||||
if let userName = json[999999]["wrong_key"]["wrong_name"].string {
|
||||
let result = json[999999]["wrong_key"]["wrong_name"]
|
||||
if let userName = result.string {
|
||||
//Calm down, take it easy, the ".string" property still produces the correct Optional String type with safety
|
||||
} else {
|
||||
//Print the error
|
||||
print(json[999999]["wrong_key"]["wrong_name"])
|
||||
print(result.error)
|
||||
}
|
||||
```
|
||||
|
||||
@@ -161,7 +169,7 @@ let name = json[0].double
|
||||
|
||||
```swift
|
||||
// Getting an array of string from a JSON Array
|
||||
let arrayNames = json["users"].arrayValue.map({$0["name"].stringValue})
|
||||
let arrayNames = json["users"].arrayValue.map {$0["name"].stringValue}
|
||||
```
|
||||
|
||||
```swift
|
||||
@@ -547,3 +555,8 @@ provider.request(.showProducts) { result in
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## SwiftyJSON Model Generator
|
||||
Tools to generate SwiftyJSON Models
|
||||
* [JSON Cafe](http://www.jsoncafe.com/)
|
||||
* [JSON Export](https://github.com/Ahmed-Ali/JSONExport)
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
// SwiftyJSON.h
|
||||
//
|
||||
// Copyright (c) 2014 - 2017 Ruoyu Fu, 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 Foundation;
|
||||
|
||||
//! Project version number for SwiftyJSON.
|
||||
FOUNDATION_EXPORT double SwiftyJSONVersionNumber;
|
||||
|
||||
//! Project version string for SwiftyJSON.
|
||||
FOUNDATION_EXPORT const unsigned char SwiftyJSONVersionString[];
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+3
-3
@@ -1,17 +1,17 @@
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "SwiftyJSON"
|
||||
s.version = "4.2.0"
|
||||
s.version = "4.3.0"
|
||||
s.summary = "SwiftyJSON makes it easy to deal with JSON data in Swift"
|
||||
s.homepage = "https://github.com/SwiftyJSON/SwiftyJSON"
|
||||
s.license = { :type => "MIT" }
|
||||
s.authors = { "lingoer" => "lingoerer@gmail.com", "tangplin" => "tangplin@gmail.com" }
|
||||
|
||||
s.requires_arc = true
|
||||
s.swift_version = "4.2"
|
||||
s.swift_version = "5.0"
|
||||
s.osx.deployment_target = "10.9"
|
||||
s.ios.deployment_target = "8.0"
|
||||
s.watchos.deployment_target = "3.0"
|
||||
s.tvos.deployment_target = "9.0"
|
||||
s.source = { :git => "https://github.com/SwiftyJSON/SwiftyJSON.git", :tag => s.version }
|
||||
s.source_files = "Source/*.swift"
|
||||
s.source_files = "Source/SwiftyJSON/*.swift"
|
||||
end
|
||||
|
||||
@@ -114,37 +114,37 @@
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
030B6CDC1A6E171D00C2D4F1 /* Info-macOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = "<group>"; };
|
||||
1B587CC41DDE04360012D8DB /* MergeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MergeTests.swift; sourceTree = "<group>"; };
|
||||
1B587CC41DDE04360012D8DB /* MergeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MergeTests.swift; path = ../SwiftJSONTests/MergeTests.swift; sourceTree = "<group>"; };
|
||||
2E4FEFDB19575BE100351305 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
2E4FEFDF19575BE100351305 /* Info-iOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = "<group>"; };
|
||||
2E4FEFE019575BE100351305 /* SwiftyJSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SwiftyJSON.h; sourceTree = "<group>"; };
|
||||
2E4FEFE019575BE100351305 /* SwiftyJSON.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SwiftyJSON.h; path = SwiftyJSON/SwiftyJSON.h; sourceTree = "<group>"; };
|
||||
2E4FEFE619575BE100351305 /* SwiftyJSON iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftyJSON iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
5DD502901D9B21810004C112 /* NestedJSONTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NestedJSONTests.swift; sourceTree = "<group>"; };
|
||||
712921EE2004E4EB00DA6340 /* CodableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CodableTests.swift; sourceTree = "<group>"; };
|
||||
5DD502901D9B21810004C112 /* NestedJSONTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NestedJSONTests.swift; path = ../SwiftJSONTests/NestedJSONTests.swift; sourceTree = "<group>"; };
|
||||
712921EE2004E4EB00DA6340 /* CodableTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = CodableTests.swift; path = ../SwiftJSONTests/CodableTests.swift; sourceTree = "<group>"; };
|
||||
7236B4F61BAC14150020529B /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
7236B4F71BAC14150020529B /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = "<group>"; };
|
||||
9C459EF61A9103B1008C9A41 /* Info-macOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-macOS.plist"; sourceTree = "<group>"; };
|
||||
9C459EF61A9103B1008C9A41 /* Info-macOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-macOS.plist"; path = "../Info-macOS.plist"; sourceTree = "<group>"; };
|
||||
9C7DFC5B1A9102BD005AA3F7 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
9C7DFC651A9102BD005AA3F7 /* SwiftyJSON macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftyJSON macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A819C49619E1A7DD00ADCC3D /* LiteralConvertibleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LiteralConvertibleTests.swift; sourceTree = "<group>"; };
|
||||
A819C49819E1B10300ADCC3D /* RawRepresentableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RawRepresentableTests.swift; sourceTree = "<group>"; };
|
||||
A819C49E19E2EE5B00ADCC3D /* SubscriptTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubscriptTests.swift; sourceTree = "<group>"; };
|
||||
A819C4A019E37FC600ADCC3D /* PrintableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrintableTests.swift; sourceTree = "<group>"; };
|
||||
A82A1C0D19D922DC009A653D /* Info-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Info-iOS.plist"; sourceTree = "<group>"; };
|
||||
A830A6941E5B2DD8001D7F6D /* MutabilityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MutabilityTests.swift; sourceTree = "<group>"; };
|
||||
A8491E1D19CD6DAE00CCFAE6 /* SwiftyJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftyJSON.swift; sourceTree = "<group>"; };
|
||||
A819C49619E1A7DD00ADCC3D /* LiteralConvertibleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LiteralConvertibleTests.swift; path = ../SwiftJSONTests/LiteralConvertibleTests.swift; sourceTree = "<group>"; };
|
||||
A819C49819E1B10300ADCC3D /* RawRepresentableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RawRepresentableTests.swift; path = ../SwiftJSONTests/RawRepresentableTests.swift; sourceTree = "<group>"; };
|
||||
A819C49E19E2EE5B00ADCC3D /* SubscriptTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SubscriptTests.swift; path = ../SwiftJSONTests/SubscriptTests.swift; sourceTree = "<group>"; };
|
||||
A819C4A019E37FC600ADCC3D /* PrintableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PrintableTests.swift; path = ../SwiftJSONTests/PrintableTests.swift; sourceTree = "<group>"; };
|
||||
A82A1C0D19D922DC009A653D /* Info-iOS.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = "Info-iOS.plist"; path = "../Info-iOS.plist"; sourceTree = "<group>"; };
|
||||
A830A6941E5B2DD8001D7F6D /* MutabilityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MutabilityTests.swift; path = ../SwiftJSONTests/MutabilityTests.swift; sourceTree = "<group>"; };
|
||||
A8491E1D19CD6DAE00CCFAE6 /* SwiftyJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SwiftyJSON.swift; path = SwiftyJSON/SwiftyJSON.swift; sourceTree = "<group>"; };
|
||||
A8580F741BCF5C5B00DA927B /* SwiftyJSON tvOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "SwiftyJSON tvOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
A8580F781BCF5C5B00DA927B /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-tvOS.plist"; sourceTree = "<group>"; };
|
||||
A863BE2719EED46F0092A41F /* RawTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RawTests.swift; sourceTree = "<group>"; };
|
||||
A86BAA0D19EBC32B009EAAEB /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PerformanceTests.swift; sourceTree = "<group>"; };
|
||||
A87080E319E3C2A600CDE086 /* SequenceTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SequenceTypeTests.swift; sourceTree = "<group>"; };
|
||||
A87080E519E3DF7800CDE086 /* ComparableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ComparableTests.swift; sourceTree = "<group>"; };
|
||||
A87080E719E439DA00CDE086 /* NumberTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NumberTests.swift; sourceTree = "<group>"; };
|
||||
A87080E919E43C0700CDE086 /* StringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringTests.swift; sourceTree = "<group>"; };
|
||||
A885D1D119CF1EE6002FD4C3 /* BaseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BaseTests.swift; sourceTree = "<group>"; };
|
||||
A8580F781BCF5C5B00DA927B /* Info-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Info-tvOS.plist"; path = "../Info-tvOS.plist"; sourceTree = "<group>"; };
|
||||
A863BE2719EED46F0092A41F /* RawTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RawTests.swift; path = ../SwiftJSONTests/RawTests.swift; sourceTree = "<group>"; };
|
||||
A86BAA0D19EBC32B009EAAEB /* PerformanceTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = PerformanceTests.swift; path = ../SwiftJSONTests/PerformanceTests.swift; sourceTree = "<group>"; };
|
||||
A87080E319E3C2A600CDE086 /* SequenceTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SequenceTypeTests.swift; path = ../SwiftJSONTests/SequenceTypeTests.swift; sourceTree = "<group>"; };
|
||||
A87080E519E3DF7800CDE086 /* ComparableTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ComparableTests.swift; path = ../SwiftJSONTests/ComparableTests.swift; sourceTree = "<group>"; };
|
||||
A87080E719E439DA00CDE086 /* NumberTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NumberTests.swift; path = ../SwiftJSONTests/NumberTests.swift; sourceTree = "<group>"; };
|
||||
A87080E919E43C0700CDE086 /* StringTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = StringTests.swift; path = ../SwiftJSONTests/StringTests.swift; sourceTree = "<group>"; };
|
||||
A885D1D119CF1EE6002FD4C3 /* BaseTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BaseTests.swift; path = ../SwiftJSONTests/BaseTests.swift; sourceTree = "<group>"; };
|
||||
A885D1DA19CFCFF0002FD4C3 /* Tests.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = Tests.json; sourceTree = "<group>"; };
|
||||
A8B66C8B19E51D6500540692 /* DictionaryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DictionaryTests.swift; sourceTree = "<group>"; };
|
||||
A8B66C8D19E52F4200540692 /* ArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArrayTests.swift; sourceTree = "<group>"; };
|
||||
A8B66C8B19E51D6500540692 /* DictionaryTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = DictionaryTests.swift; path = ../SwiftJSONTests/DictionaryTests.swift; sourceTree = "<group>"; };
|
||||
A8B66C8D19E52F4200540692 /* ArrayTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ArrayTests.swift; path = ../SwiftJSONTests/ArrayTests.swift; sourceTree = "<group>"; };
|
||||
E4D7CCE81B9465A700EE7221 /* SwiftyJSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwiftyJSON.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E4D7CCE91B9465A800EE7221 /* Info-watchOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-watchOS.plist"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
@@ -209,7 +209,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
2E4FEFDD19575BE100351305 /* Source */,
|
||||
2E4FEFEA19575BE100351305 /* SwiftyJSONTests */,
|
||||
2E4FEFEA19575BE100351305 /* Tests */,
|
||||
2E4FEFDC19575BE100351305 /* Products */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
@@ -249,11 +249,10 @@
|
||||
name = "Supporting Files";
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
2E4FEFEA19575BE100351305 /* SwiftyJSONTests */ = {
|
||||
2E4FEFEA19575BE100351305 /* Tests */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
1B587CC41DDE04360012D8DB /* MergeTests.swift */,
|
||||
A885D1DA19CFCFF0002FD4C3 /* Tests.json */,
|
||||
A86BAA0D19EBC32B009EAAEB /* PerformanceTests.swift */,
|
||||
A885D1D119CF1EE6002FD4C3 /* BaseTests.swift */,
|
||||
5DD502901D9B21810004C112 /* NestedJSONTests.swift */,
|
||||
@@ -272,13 +271,14 @@
|
||||
712921EE2004E4EB00DA6340 /* CodableTests.swift */,
|
||||
2E4FEFEB19575BE100351305 /* Supporting Files */,
|
||||
);
|
||||
name = SwiftyJSONTests;
|
||||
path = Tests/SwiftyJSONTests;
|
||||
name = Tests;
|
||||
path = Tests/Tes;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
2E4FEFEB19575BE100351305 /* Supporting Files */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
A885D1DA19CFCFF0002FD4C3 /* Tests.json */,
|
||||
A82A1C0D19D922DC009A653D /* Info-iOS.plist */,
|
||||
9C459EF61A9103B1008C9A41 /* Info-macOS.plist */,
|
||||
A8580F781BCF5C5B00DA927B /* Info-tvOS.plist */,
|
||||
@@ -457,7 +457,7 @@
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastSwiftUpdateCheck = 0710;
|
||||
LastUpgradeCheck = 0930;
|
||||
LastUpgradeCheck = 1020;
|
||||
TargetAttributes = {
|
||||
2E4FEFDA19575BE100351305 = {
|
||||
CreatedOnToolsVersion = 6.0;
|
||||
@@ -499,10 +499,11 @@
|
||||
};
|
||||
buildConfigurationList = 2E4FEFD519575BE100351305 /* Build configuration list for PBXProject "SwiftyJSON" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
developmentRegion = English;
|
||||
developmentRegion = en;
|
||||
hasScannedForEncodings = 0;
|
||||
knownRegions = (
|
||||
en,
|
||||
Base,
|
||||
);
|
||||
mainGroup = 2E4FEFD119575BE100351305;
|
||||
productRefGroup = 2E4FEFDC19575BE100351305 /* Products */;
|
||||
@@ -722,6 +723,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
@@ -782,6 +784,7 @@
|
||||
isa = XCBuildConfiguration;
|
||||
buildSettings = {
|
||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
|
||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||
CLANG_CXX_LIBRARY = "libc++";
|
||||
CLANG_ENABLE_MODULES = YES;
|
||||
@@ -853,7 +856,7 @@
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -877,7 +880,7 @@
|
||||
PRODUCT_NAME = SwiftyJSON;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -891,7 +894,7 @@
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-iOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-iOS.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.1;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
METAL_ENABLE_DEBUG_INFO = YES;
|
||||
@@ -899,7 +902,7 @@
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -909,14 +912,14 @@
|
||||
CODE_SIGN_IDENTITY = "";
|
||||
DEVELOPMENT_TEAM = "";
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-iOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-iOS.plist";
|
||||
IPHONEOS_DEPLOYMENT_TARGET = 9.1;
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
METAL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.swiftyjson.${PRODUCT_NAME:rfc1034identifier}";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
|
||||
SWIFT_VERSION = 4.0;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -941,7 +944,7 @@
|
||||
SDKROOT = appletvos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 3;
|
||||
TVOS_DEPLOYMENT_TARGET = 9.0;
|
||||
};
|
||||
@@ -967,7 +970,7 @@
|
||||
PRODUCT_NAME = SwiftyJSON;
|
||||
SDKROOT = appletvos;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 3;
|
||||
TVOS_DEPLOYMENT_TARGET = 9.0;
|
||||
};
|
||||
@@ -1000,7 +1003,7 @@
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -1027,7 +1030,7 @@
|
||||
PRODUCT_NAME = "$(PROJECT_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SKIP_INSTALL = YES;
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -1042,7 +1045,7 @@
|
||||
"DEBUG=1",
|
||||
"$(inherited)",
|
||||
);
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-macOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-macOS.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
@@ -1050,7 +1053,7 @@
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Debug;
|
||||
};
|
||||
@@ -1062,14 +1065,14 @@
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
FRAMEWORK_SEARCH_PATHS = "";
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-macOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-macOS.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
|
||||
MACOSX_DEPLOYMENT_TARGET = 10.10;
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.swiftyjson.$(PRODUCT_NAME:rfc1034identifier)";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = macosx;
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
};
|
||||
name = Release;
|
||||
};
|
||||
@@ -1096,14 +1099,14 @@
|
||||
DEBUG_INFORMATION_FORMAT = dwarf;
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = 0;
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-tvOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-tvOS.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MTL_ENABLE_DEBUG_INFO = YES;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.tangplin.SwiftyJSON-tvOS-Tests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = appletvos;
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TVOS_DEPLOYMENT_TARGET = 9.0;
|
||||
};
|
||||
name = Debug;
|
||||
@@ -1116,13 +1119,13 @@
|
||||
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
|
||||
GCC_NO_COMMON_BLOCKS = YES;
|
||||
GCC_OPTIMIZATION_LEVEL = s;
|
||||
INFOPLIST_FILE = "Tests/SwiftyJSONTests/Info-tvOS.plist";
|
||||
INFOPLIST_FILE = "Tests/Info-tvOS.plist";
|
||||
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||
MTL_ENABLE_DEBUG_INFO = NO;
|
||||
PRODUCT_BUNDLE_IDENTIFIER = "com.tangplin.SwiftyJSON-tvOS-Tests";
|
||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||
SDKROOT = appletvos;
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TVOS_DEPLOYMENT_TARGET = 9.0;
|
||||
};
|
||||
name = Release;
|
||||
@@ -1149,7 +1152,7 @@
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "watchsimulator watchos";
|
||||
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 3.0;
|
||||
};
|
||||
@@ -1176,7 +1179,7 @@
|
||||
SDKROOT = watchos;
|
||||
SKIP_INSTALL = YES;
|
||||
SUPPORTED_PLATFORMS = "watchsimulator watchos";
|
||||
SWIFT_VERSION = 4.2;
|
||||
SWIFT_VERSION = 5.0;
|
||||
TARGETED_DEVICE_FAMILY = 4;
|
||||
WATCHOS_DEPLOYMENT_TARGET = 3.0;
|
||||
};
|
||||
|
||||
+8
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IDEDidComputeMac32BitWarning</key>
|
||||
<true/>
|
||||
</dict>
|
||||
</plist>
|
||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1020"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1020"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
Vendored
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1020"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Scheme
|
||||
LastUpgradeVersion = "0930"
|
||||
LastUpgradeVersion = "1020"
|
||||
version = "1.3">
|
||||
<BuildAction
|
||||
parallelizeBuildables = "YES"
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>${EXECUTABLE_NAME}</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>${PRODUCT_NAME}</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>en</string>
|
||||
<key>CFBundleExecutable</key>
|
||||
<string>$(EXECUTABLE_NAME)</string>
|
||||
<key>CFBundleIdentifier</key>
|
||||
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
|
||||
<key>CFBundleInfoDictionaryVersion</key>
|
||||
<string>6.0</string>
|
||||
<key>CFBundleName</key>
|
||||
<string>$(PRODUCT_NAME)</string>
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>BNDL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.0</string>
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
@@ -0,0 +1,45 @@
|
||||
// ArrayTests.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 ArrayTests: XCTestCase {
|
||||
|
||||
func testSingleDimensionalArraysGetter() {
|
||||
let array = ["1", "2", "a", "B", "D"]
|
||||
let json = JSON(array)
|
||||
XCTAssertEqual((json.array![0] as JSON).string!, "1")
|
||||
XCTAssertEqual((json.array![1] as JSON).string!, "2")
|
||||
XCTAssertEqual((json.array![2] as JSON).string!, "a")
|
||||
XCTAssertEqual((json.array![3] as JSON).string!, "B")
|
||||
XCTAssertEqual((json.array![4] as JSON).string!, "D")
|
||||
}
|
||||
|
||||
func testSingleDimensionalArraysSetter() {
|
||||
let array = ["1", "2", "a", "B", "D"]
|
||||
var json = JSON(array)
|
||||
json.arrayObject = ["111", "222"]
|
||||
XCTAssertEqual((json.array![0] as JSON).string!, "111")
|
||||
XCTAssertEqual((json.array![1] as JSON).string!, "222")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,277 @@
|
||||
// BaseTests.swift
|
||||
//
|
||||
// Copyright (c) 2014 - 2017 Ruoyu Fu, 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 BaseTests: XCTestCase {
|
||||
|
||||
var testData: Data!
|
||||
|
||||
override func setUp() {
|
||||
|
||||
super.setUp()
|
||||
|
||||
// let file = "./Tests/Tes/Tests.json"
|
||||
// self.testData = try? Data(contentsOf: URL(fileURLWithPath: file))
|
||||
if let file = Bundle(for: BaseTests.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() {
|
||||
super.tearDown()
|
||||
}
|
||||
|
||||
func testInit() {
|
||||
guard let json0 = try? JSON(data: self.testData) else {
|
||||
XCTFail("Unable to parse testData")
|
||||
return
|
||||
}
|
||||
XCTAssertEqual(json0.array!.count, 3)
|
||||
XCTAssertEqual(JSON("123").description, "123")
|
||||
XCTAssertEqual(JSON(["1": "2"])["1"].string!, "2")
|
||||
let dictionary = NSMutableDictionary()
|
||||
dictionary.setObject(NSNumber(value: 1.0), forKey: "number" as NSString)
|
||||
dictionary.setObject(NSNull(), forKey: "null" as NSString)
|
||||
_ = JSON(dictionary)
|
||||
do {
|
||||
let object: Any = try JSONSerialization.jsonObject(with: self.testData, options: [])
|
||||
let json2 = JSON(object)
|
||||
XCTAssertEqual(json0, json2)
|
||||
} catch _ {
|
||||
}
|
||||
}
|
||||
|
||||
func testCompare() {
|
||||
XCTAssertNotEqual(JSON("32.1234567890"), JSON(32.1234567890))
|
||||
let veryLargeNumber: UInt64 = 9876543210987654321
|
||||
XCTAssertNotEqual(JSON("9876543210987654321"), JSON(NSNumber(value: veryLargeNumber)))
|
||||
XCTAssertNotEqual(JSON("9876543210987654321.12345678901234567890"), JSON(9876543210987654321.12345678901234567890))
|
||||
XCTAssertEqual(JSON("😊"), JSON("😊"))
|
||||
XCTAssertNotEqual(JSON("😱"), JSON("😁"))
|
||||
XCTAssertEqual(JSON([123, 321, 456]), JSON([123, 321, 456]))
|
||||
XCTAssertNotEqual(JSON([123, 321, 456]), JSON(123456789))
|
||||
XCTAssertNotEqual(JSON([123, 321, 456]), JSON("string"))
|
||||
XCTAssertNotEqual(JSON(["1": 123, "2": 321, "3": 456]), JSON("string"))
|
||||
XCTAssertEqual(JSON(["1": 123, "2": 321, "3": 456]), JSON(["2": 321, "1": 123, "3": 456]))
|
||||
XCTAssertEqual(JSON(NSNull()), JSON(NSNull()))
|
||||
XCTAssertNotEqual(JSON(NSNull()), JSON(123))
|
||||
}
|
||||
|
||||
func testJSONDoesProduceValidWithCorrectKeyPath() {
|
||||
|
||||
guard let json = try? JSON(data: self.testData) else {
|
||||
XCTFail("Unable to parse testData")
|
||||
return
|
||||
}
|
||||
|
||||
let tweets = json
|
||||
let tweets_array = json.array
|
||||
let tweets_1 = json[1]
|
||||
_ = tweets_1[1]
|
||||
let tweets_1_user_name = tweets_1["user"]["name"]
|
||||
let tweets_1_user_name_string = tweets_1["user"]["name"].string
|
||||
XCTAssertNotEqual(tweets.type, Type.null)
|
||||
XCTAssert(tweets_array != nil)
|
||||
XCTAssertNotEqual(tweets_1.type, Type.null)
|
||||
XCTAssertEqual(tweets_1_user_name, JSON("Raffi Krikorian"))
|
||||
XCTAssertEqual(tweets_1_user_name_string!, "Raffi Krikorian")
|
||||
|
||||
let tweets_1_coordinates = tweets_1["coordinates"]
|
||||
let tweets_1_coordinates_coordinates = tweets_1_coordinates["coordinates"]
|
||||
let tweets_1_coordinates_coordinates_point_0_double = tweets_1_coordinates_coordinates[0].double
|
||||
let tweets_1_coordinates_coordinates_point_1_float = tweets_1_coordinates_coordinates[1].float
|
||||
let new_tweets_1_coordinates_coordinates = JSON([-122.25831, 37.871609] as NSArray)
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates, new_tweets_1_coordinates_coordinates)
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates_point_0_double!, -122.25831)
|
||||
XCTAssertTrue(tweets_1_coordinates_coordinates_point_1_float! == 37.871609)
|
||||
let tweets_1_coordinates_coordinates_point_0_string = tweets_1_coordinates_coordinates[0].stringValue
|
||||
let tweets_1_coordinates_coordinates_point_1_string = tweets_1_coordinates_coordinates[1].stringValue
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates_point_0_string, "-122.25831")
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates_point_1_string, "37.871609")
|
||||
let tweets_1_coordinates_coordinates_point_0 = tweets_1_coordinates_coordinates[0]
|
||||
let tweets_1_coordinates_coordinates_point_1 = tweets_1_coordinates_coordinates[1]
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates_point_0, JSON(-122.25831))
|
||||
XCTAssertEqual(tweets_1_coordinates_coordinates_point_1, JSON(37.871609))
|
||||
|
||||
let created_at = json[0]["created_at"].string
|
||||
let id_str = json[0]["id_str"].string
|
||||
let favorited = json[0]["favorited"].bool
|
||||
let id = json[0]["id"].int64
|
||||
let in_reply_to_user_id_str = json[0]["in_reply_to_user_id_str"]
|
||||
XCTAssertEqual(created_at!, "Tue Aug 28 21:16:23 +0000 2012")
|
||||
XCTAssertEqual(id_str!, "240558470661799936")
|
||||
XCTAssertFalse(favorited!)
|
||||
XCTAssertEqual(id!, 240558470661799936)
|
||||
XCTAssertEqual(in_reply_to_user_id_str.type, Type.null)
|
||||
|
||||
let user = json[0]["user"]
|
||||
let user_name = user["name"].string
|
||||
let user_profile_image_url = user["profile_image_url"].url
|
||||
XCTAssert(user_name == "OAuth Dancer")
|
||||
XCTAssert(user_profile_image_url == URL(string: "http://a0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg"))
|
||||
|
||||
let user_dictionary = json[0]["user"].dictionary
|
||||
let user_dictionary_name = user_dictionary?["name"]?.string
|
||||
let user_dictionary_name_profile_image_url = user_dictionary?["profile_image_url"]?.url
|
||||
XCTAssert(user_dictionary_name == "OAuth Dancer")
|
||||
XCTAssert(user_dictionary_name_profile_image_url == URL(string: "http://a0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg"))
|
||||
}
|
||||
|
||||
func testJSONNumberCompare() {
|
||||
XCTAssertEqual(JSON(12376352.123321), JSON(12376352.123321))
|
||||
XCTAssertGreaterThan(JSON(20.211), JSON(20.112))
|
||||
XCTAssertGreaterThanOrEqual(JSON(30.211), JSON(20.112))
|
||||
XCTAssertGreaterThanOrEqual(JSON(65232), JSON(65232))
|
||||
XCTAssertLessThan(JSON(-82320.211), JSON(20.112))
|
||||
XCTAssertLessThanOrEqual(JSON(-320.211), JSON(123.1))
|
||||
XCTAssertLessThanOrEqual(JSON(-8763), JSON(-8763))
|
||||
|
||||
XCTAssertEqual(JSON(12376352.123321), JSON(12376352.123321))
|
||||
XCTAssertGreaterThan(JSON(20.211), JSON(20.112))
|
||||
XCTAssertGreaterThanOrEqual(JSON(30.211), JSON(20.112))
|
||||
XCTAssertGreaterThanOrEqual(JSON(65232), JSON(65232))
|
||||
XCTAssertLessThan(JSON(-82320.211), JSON(20.112))
|
||||
XCTAssertLessThanOrEqual(JSON(-320.211), JSON(123.1))
|
||||
XCTAssertLessThanOrEqual(JSON(-8763), JSON(-8763))
|
||||
}
|
||||
|
||||
func testNumberConvertToString() {
|
||||
XCTAssertEqual(JSON(true).stringValue, "true")
|
||||
XCTAssertEqual(JSON(999.9823).stringValue, "999.9823")
|
||||
XCTAssertEqual(JSON(true).number!.stringValue, "1")
|
||||
XCTAssertEqual(JSON(false).number!.stringValue, "0")
|
||||
XCTAssertEqual(JSON("hello").numberValue.stringValue, "0")
|
||||
XCTAssertEqual(JSON(NSNull()).numberValue.stringValue, "0")
|
||||
XCTAssertEqual(JSON(["a", "b", "c", "d"]).numberValue.stringValue, "0")
|
||||
XCTAssertEqual(JSON(["a": "b", "c": "d"]).numberValue.stringValue, "0")
|
||||
}
|
||||
|
||||
func testNumberPrint() {
|
||||
|
||||
XCTAssertEqual(JSON(false).description, "false")
|
||||
XCTAssertEqual(JSON(true).description, "true")
|
||||
|
||||
XCTAssertEqual(JSON(1).description, "1")
|
||||
XCTAssertEqual(JSON(22).description, "22")
|
||||
#if (arch(x86_64) || arch(arm64))
|
||||
XCTAssertEqual(JSON(9.22337203685478E18).description, "9.22337203685478e+18")
|
||||
#elseif (arch(i386) || arch(arm))
|
||||
XCTAssertEqual(JSON(2147483647).description, "2147483647")
|
||||
#endif
|
||||
XCTAssertEqual(JSON(-1).description, "-1")
|
||||
XCTAssertEqual(JSON(-934834834).description, "-934834834")
|
||||
XCTAssertEqual(JSON(-2147483648).description, "-2147483648")
|
||||
|
||||
XCTAssertEqual(JSON(1.5555).description, "1.5555")
|
||||
XCTAssertEqual(JSON(-9.123456789).description, "-9.123456789")
|
||||
XCTAssertEqual(JSON(-0.00000000000000001).description, "-1e-17")
|
||||
XCTAssertEqual(JSON(-999999999999999999999999.000000000000000000000001).description, "-1e+24")
|
||||
XCTAssertEqual(JSON(-9999999991999999999999999.88888883433343439438493483483943948341).stringValue, "-9.999999991999999e+24")
|
||||
|
||||
XCTAssertEqual(JSON(Int(Int.max)).description, "\(Int.max)")
|
||||
XCTAssertEqual(JSON(NSNumber(value: Int.min)).description, "\(Int.min)")
|
||||
XCTAssertEqual(JSON(NSNumber(value: UInt.max)).description, "\(UInt.max)")
|
||||
XCTAssertEqual(JSON(NSNumber(value: UInt64.max)).description, "\(UInt64.max)")
|
||||
XCTAssertEqual(JSON(NSNumber(value: Int64.max)).description, "\(Int64.max)")
|
||||
XCTAssertEqual(JSON(NSNumber(value: UInt64.max)).description, "\(UInt64.max)")
|
||||
|
||||
XCTAssertEqual(JSON(Double.infinity).description, "inf")
|
||||
XCTAssertEqual(JSON(-Double.infinity).description, "-inf")
|
||||
XCTAssertEqual(JSON(Double.nan).description, "nan")
|
||||
|
||||
XCTAssertEqual(JSON(1.0/0.0).description, "inf")
|
||||
XCTAssertEqual(JSON(-1.0/0.0).description, "-inf")
|
||||
XCTAssertEqual(JSON(0.0/0.0).description, "nan")
|
||||
}
|
||||
|
||||
func testNullJSON() {
|
||||
XCTAssertEqual(JSON(NSNull()).debugDescription, "null")
|
||||
|
||||
let json: JSON = JSON.null
|
||||
XCTAssertEqual(json.debugDescription, "null")
|
||||
XCTAssertNil(json.error)
|
||||
let json1: JSON = JSON(NSNull())
|
||||
if json1 != JSON.null {
|
||||
XCTFail("json1 should be nil")
|
||||
}
|
||||
}
|
||||
|
||||
func testExistance() {
|
||||
let dictionary = ["number": 1111]
|
||||
let json = JSON(dictionary)
|
||||
XCTAssertFalse(json["unspecifiedValue"].exists())
|
||||
XCTAssertFalse(json[0].exists())
|
||||
XCTAssertTrue(json["number"].exists())
|
||||
|
||||
let array = [["number": 1111]]
|
||||
let jsonForArray = JSON(array)
|
||||
XCTAssertTrue(jsonForArray[0].exists())
|
||||
XCTAssertFalse(jsonForArray[1].exists())
|
||||
XCTAssertFalse(jsonForArray["someValue"].exists())
|
||||
}
|
||||
|
||||
func testErrorHandle() {
|
||||
guard let json = try? JSON(data: self.testData) else {
|
||||
XCTFail("Unable to parse testData")
|
||||
return
|
||||
}
|
||||
if json["wrong-type"].string != nil {
|
||||
XCTFail("Should not run into here")
|
||||
} else {
|
||||
XCTAssertEqual(json["wrong-type"].error, SwiftyJSONError.wrongType)
|
||||
}
|
||||
|
||||
if json[0]["not-exist"].string != nil {
|
||||
XCTFail("Should not run into here")
|
||||
} else {
|
||||
XCTAssertEqual(json[0]["not-exist"].error, SwiftyJSONError.notExist)
|
||||
}
|
||||
|
||||
let wrongJSON = JSON(NSObject())
|
||||
if let error = wrongJSON.error {
|
||||
XCTAssertEqual(error, SwiftyJSONError.unsupportedType)
|
||||
}
|
||||
}
|
||||
|
||||
func testReturnObject() {
|
||||
guard let json = try? JSON(data: self.testData) else {
|
||||
XCTFail("Unable to parse testData")
|
||||
return
|
||||
}
|
||||
XCTAssertNotNil(json.object)
|
||||
}
|
||||
|
||||
func testErrorThrowing() {
|
||||
let invalidJson = "{\"foo\": 300]" // deliberately incorrect JSON
|
||||
let invalidData = invalidJson.data(using: .utf8)!
|
||||
do {
|
||||
_ = try JSON(data: invalidData)
|
||||
XCTFail("Should have thrown error; we should not have gotten here")
|
||||
} catch {
|
||||
// everything is OK
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,104 @@
|
||||
// CodableTests.swift
|
||||
//
|
||||
// Created by Lei Wang on 2018/1/9.
|
||||
//
|
||||
// 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 CodableTests: XCTestCase {
|
||||
|
||||
func testEncodeNull() {
|
||||
var json = JSON([NSNull()])
|
||||
_ = try! JSONEncoder().encode(json)
|
||||
json = JSON([nil])
|
||||
_ = try! JSONEncoder().encode(json)
|
||||
let dictionary: [String: Any?] = ["key": nil]
|
||||
json = JSON(dictionary)
|
||||
_ = try! JSONEncoder().encode(json)
|
||||
}
|
||||
|
||||
func testArrayCodable() {
|
||||
let jsonString = """
|
||||
[1,"false", ["A", 4.3231],"3",true]
|
||||
"""
|
||||
var data = jsonString.data(using: .utf8)!
|
||||
let json = try! JSONDecoder().decode(JSON.self, from: data)
|
||||
XCTAssertEqual(json.arrayValue.first?.int, 1)
|
||||
XCTAssertEqual(json[1].bool, nil)
|
||||
XCTAssertEqual(json[1].string, "false")
|
||||
XCTAssertEqual(json[3].string, "3")
|
||||
XCTAssertEqual(json[2][1].double!, 4.3231)
|
||||
XCTAssertEqual(json.arrayValue[0].bool, nil)
|
||||
XCTAssertEqual(json.array!.last!.bool, true)
|
||||
let jsonList = try! JSONDecoder().decode([JSON].self, from: data)
|
||||
XCTAssertEqual(jsonList.first?.int, 1)
|
||||
XCTAssertEqual(jsonList.last!.bool, true)
|
||||
data = try! JSONEncoder().encode(json)
|
||||
let list = try! JSONSerialization.jsonObject(with: data, options: []) as! [Any]
|
||||
XCTAssertEqual(list[0] as! Int, 1)
|
||||
XCTAssertEqual((list[2] as! [Any])[1] as! NSNumber, 4.3231)
|
||||
}
|
||||
|
||||
func testDictionaryCodable() {
|
||||
let dictionary: [String: Any] = ["number": 9823.212, "name": "NAME", "list": [1234, 4.21223256], "object": ["sub_number": 877.2323, "sub_name": "sub_name"], "bool": true]
|
||||
var data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
|
||||
let json = try! JSONDecoder().decode(JSON.self, from: data)
|
||||
XCTAssertNotNil(json.dictionary)
|
||||
XCTAssertEqual(json["number"].float, 9823.212)
|
||||
XCTAssertEqual(json["list"].arrayObject is [NSNumber], true)
|
||||
XCTAssertEqual(json["object"]["sub_number"].float, 877.2323)
|
||||
XCTAssertEqual(json["bool"].bool, true)
|
||||
let jsonDict = try! JSONDecoder().decode([String: JSON].self, from: data)
|
||||
XCTAssertEqual(jsonDict["number"]?.int, 9823)
|
||||
XCTAssertEqual(jsonDict["object"]?["sub_name"], "sub_name")
|
||||
data = try! JSONEncoder().encode(json)
|
||||
var encoderDict = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
|
||||
XCTAssertEqual(encoderDict["list"] as! [NSNumber], [1234, 4.21223256])
|
||||
XCTAssertEqual(encoderDict["bool"] as! Bool, true)
|
||||
data = try! JSONEncoder().encode(jsonDict)
|
||||
encoderDict = try! JSONSerialization.jsonObject(with: data, options: []) as! [String: Any]
|
||||
XCTAssertEqual(encoderDict["name"] as! String, dictionary["name"] as! String)
|
||||
XCTAssertEqual((encoderDict["object"] as! [String: Any])["sub_number"] as! NSNumber, 877.2323)
|
||||
}
|
||||
|
||||
func testCodableModel() {
|
||||
let dictionary: [String: Any] = [
|
||||
"number": 9823.212,
|
||||
"name": "NAME",
|
||||
"list": [1234, 4.21223256],
|
||||
"object": ["sub_number": 877.2323, "sub_name": "sub_name"],
|
||||
"bool": true]
|
||||
let data = try! JSONSerialization.data(withJSONObject: dictionary, options: [])
|
||||
let model = try! JSONDecoder().decode(CodableModel.self, from: data)
|
||||
XCTAssertEqual(model.subName, "sub_name")
|
||||
}
|
||||
}
|
||||
|
||||
private struct CodableModel: Codable {
|
||||
let name: String
|
||||
let number: Double
|
||||
let bool: Bool
|
||||
let list: [Double]
|
||||
private let object: JSON
|
||||
var subName: String? {
|
||||
return object["sub_name"].string
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,337 @@
|
||||
// ComparableTests.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 ComparableTests: XCTestCase {
|
||||
|
||||
func testNumberEqual() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(1234567890.876623)
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 == 1234567890.876623)
|
||||
|
||||
let jsonL2: JSON = 987654321
|
||||
let jsonR2: JSON = JSON(987654321)
|
||||
XCTAssertEqual(jsonL2, jsonR2)
|
||||
XCTAssertTrue(jsonR2 == 987654321)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87654321.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87654321.12345678))
|
||||
XCTAssertEqual(jsonL3, jsonR3)
|
||||
XCTAssertTrue(jsonR3 == 87654321.12345678)
|
||||
}
|
||||
|
||||
func testNumberNotEqual() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(123.123)
|
||||
XCTAssertNotEqual(jsonL1, jsonR1)
|
||||
XCTAssertFalse(jsonL1 == 34343)
|
||||
|
||||
let jsonL2: JSON = 8773
|
||||
let jsonR2: JSON = JSON(123.23)
|
||||
XCTAssertNotEqual(jsonL2, jsonR2)
|
||||
XCTAssertFalse(jsonR1 == 454352)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87654321.45678))
|
||||
XCTAssertNotEqual(jsonL3, jsonR3)
|
||||
XCTAssertFalse(jsonL3 == 4545.232)
|
||||
}
|
||||
|
||||
func testNumberGreaterThanOrEqual() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(123.123)
|
||||
XCTAssertGreaterThanOrEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 >= -37434)
|
||||
|
||||
let jsonL2: JSON = 8773
|
||||
let jsonR2: JSON = JSON(-87343)
|
||||
XCTAssertGreaterThanOrEqual(jsonL2, jsonR2)
|
||||
XCTAssertTrue(jsonR2 >= -988343)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
XCTAssertGreaterThanOrEqual(jsonL3, jsonR3)
|
||||
XCTAssertTrue(jsonR3 >= 0.3232)
|
||||
}
|
||||
|
||||
func testNumberLessThanOrEqual() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(123.123)
|
||||
XCTAssertLessThanOrEqual(jsonR1, jsonL1)
|
||||
XCTAssertFalse(83487343.3493 <= jsonR1)
|
||||
|
||||
let jsonL2: JSON = 8773
|
||||
let jsonR2: JSON = JSON(-123.23)
|
||||
XCTAssertLessThanOrEqual(jsonR2, jsonL2)
|
||||
XCTAssertFalse(9348343 <= jsonR2)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
XCTAssertLessThanOrEqual(jsonR3, jsonL3)
|
||||
XCTAssertTrue(87621.12345678 <= jsonR3)
|
||||
}
|
||||
|
||||
func testNumberGreaterThan() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(123.123)
|
||||
XCTAssertGreaterThan(jsonL1, jsonR1)
|
||||
XCTAssertFalse(jsonR1 > 192388843.0988)
|
||||
|
||||
let jsonL2: JSON = 8773
|
||||
let jsonR2: JSON = JSON(123.23)
|
||||
XCTAssertGreaterThan(jsonL2, jsonR2)
|
||||
XCTAssertFalse(jsonR2 > 877434)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87621.1234567))
|
||||
XCTAssertGreaterThan(jsonL3, jsonR3)
|
||||
XCTAssertFalse(-7799 > jsonR3)
|
||||
}
|
||||
|
||||
func testNumberLessThan() {
|
||||
let jsonL1: JSON = 1234567890.876623
|
||||
let jsonR1: JSON = JSON(123.123)
|
||||
XCTAssertLessThan(jsonR1, jsonL1)
|
||||
XCTAssertTrue(jsonR1 < 192388843.0988)
|
||||
|
||||
let jsonL2: JSON = 8773
|
||||
let jsonR2: JSON = JSON(123.23)
|
||||
XCTAssertLessThan(jsonR2, jsonL2)
|
||||
XCTAssertTrue(jsonR2 < 877434)
|
||||
|
||||
let jsonL3: JSON = JSON(NSNumber(value: 87621.12345678))
|
||||
let jsonR3: JSON = JSON(NSNumber(value: 87621.1234567))
|
||||
XCTAssertLessThan(jsonR3, jsonL3)
|
||||
XCTAssertTrue(-7799 < jsonR3)
|
||||
}
|
||||
|
||||
func testBoolEqual() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(true)
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 == true)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(false)
|
||||
XCTAssertEqual(jsonL2, jsonR2)
|
||||
XCTAssertTrue(jsonL2 == false)
|
||||
}
|
||||
|
||||
func testBoolNotEqual() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(false)
|
||||
XCTAssertNotEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 != false)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(true)
|
||||
XCTAssertNotEqual(jsonL2, jsonR2)
|
||||
XCTAssertTrue(jsonL2 != true)
|
||||
}
|
||||
|
||||
func testBoolGreaterThanOrEqual() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(true)
|
||||
XCTAssertGreaterThanOrEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 >= true)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(false)
|
||||
XCTAssertGreaterThanOrEqual(jsonL2, jsonR2)
|
||||
XCTAssertFalse(jsonL2 >= true)
|
||||
}
|
||||
|
||||
func testBoolLessThanOrEqual() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(true)
|
||||
XCTAssertLessThanOrEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(true <= jsonR1)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(false)
|
||||
XCTAssertLessThanOrEqual(jsonL2, jsonR2)
|
||||
XCTAssertFalse(jsonL2 <= true)
|
||||
}
|
||||
|
||||
func testBoolGreaterThan() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(true)
|
||||
XCTAssertFalse(jsonL1 > jsonR1)
|
||||
XCTAssertFalse(jsonL1 > true)
|
||||
XCTAssertFalse(jsonR1 > false)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(false)
|
||||
XCTAssertFalse(jsonL2 > jsonR2)
|
||||
XCTAssertFalse(jsonL2 > false)
|
||||
XCTAssertFalse(jsonR2 > true)
|
||||
|
||||
let jsonL3: JSON = true
|
||||
let jsonR3: JSON = JSON(false)
|
||||
XCTAssertFalse(jsonL3 > jsonR3)
|
||||
XCTAssertFalse(jsonL3 > false)
|
||||
XCTAssertFalse(jsonR3 > true)
|
||||
|
||||
let jsonL4: JSON = false
|
||||
let jsonR4: JSON = JSON(true)
|
||||
XCTAssertFalse(jsonL4 > jsonR4)
|
||||
XCTAssertFalse(jsonL4 > false)
|
||||
XCTAssertFalse(jsonR4 > true)
|
||||
}
|
||||
|
||||
func testBoolLessThan() {
|
||||
let jsonL1: JSON = true
|
||||
let jsonR1: JSON = JSON(true)
|
||||
XCTAssertFalse(jsonL1 < jsonR1)
|
||||
XCTAssertFalse(jsonL1 < true)
|
||||
XCTAssertFalse(jsonR1 < false)
|
||||
|
||||
let jsonL2: JSON = false
|
||||
let jsonR2: JSON = JSON(false)
|
||||
XCTAssertFalse(jsonL2 < jsonR2)
|
||||
XCTAssertFalse(jsonL2 < false)
|
||||
XCTAssertFalse(jsonR2 < true)
|
||||
|
||||
let jsonL3: JSON = true
|
||||
let jsonR3: JSON = JSON(false)
|
||||
XCTAssertFalse(jsonL3 < jsonR3)
|
||||
XCTAssertFalse(jsonL3 < false)
|
||||
XCTAssertFalse(jsonR3 < true)
|
||||
|
||||
let jsonL4: JSON = false
|
||||
let jsonR4: JSON = JSON(true)
|
||||
XCTAssertFalse(jsonL4 < jsonR4)
|
||||
XCTAssertFalse(jsonL4 < false)
|
||||
XCTAssertFalse(true < jsonR4)
|
||||
}
|
||||
|
||||
func testStringEqual() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 == "abcdefg 123456789 !@#$%^&*()")
|
||||
}
|
||||
|
||||
func testStringNotEqual() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("-=[]\\\"987654321")
|
||||
|
||||
XCTAssertNotEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 != "not equal")
|
||||
}
|
||||
|
||||
func testStringGreaterThanOrEqual() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
XCTAssertGreaterThanOrEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 >= "abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
let jsonL2: JSON = "z-+{}:"
|
||||
let jsonR2: JSON = JSON("a<>?:")
|
||||
XCTAssertGreaterThanOrEqual(jsonL2, jsonR2)
|
||||
XCTAssertTrue(jsonL2 >= "mnbvcxz")
|
||||
}
|
||||
|
||||
func testStringLessThanOrEqual() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
XCTAssertLessThanOrEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 <= "abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
let jsonL2: JSON = "z-+{}:"
|
||||
let jsonR2: JSON = JSON("a<>?:")
|
||||
XCTAssertLessThanOrEqual(jsonR2, jsonL2)
|
||||
XCTAssertTrue("mnbvcxz" <= jsonL2)
|
||||
}
|
||||
|
||||
func testStringGreaterThan() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
XCTAssertFalse(jsonL1 > jsonR1)
|
||||
XCTAssertFalse(jsonL1 > "abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
let jsonL2: JSON = "z-+{}:"
|
||||
let jsonR2: JSON = JSON("a<>?:")
|
||||
XCTAssertGreaterThan(jsonL2, jsonR2)
|
||||
XCTAssertFalse("87663434" > jsonL2)
|
||||
}
|
||||
|
||||
func testStringLessThan() {
|
||||
let jsonL1: JSON = "abcdefg 123456789 !@#$%^&*()"
|
||||
let jsonR1: JSON = JSON("abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
XCTAssertFalse(jsonL1 < jsonR1)
|
||||
XCTAssertFalse(jsonL1 < "abcdefg 123456789 !@#$%^&*()")
|
||||
|
||||
let jsonL2: JSON = "98774"
|
||||
let jsonR2: JSON = JSON("123456")
|
||||
XCTAssertLessThan(jsonR2, jsonL2)
|
||||
XCTAssertFalse(jsonL2 < "09")
|
||||
}
|
||||
|
||||
func testNil() {
|
||||
let jsonL1: JSON = JSON.null
|
||||
let jsonR1: JSON = JSON(NSNull())
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 != "123")
|
||||
XCTAssertFalse(jsonL1 > "abcd")
|
||||
XCTAssertFalse(jsonR1 < "*&^")
|
||||
XCTAssertFalse(jsonL1 >= "jhfid")
|
||||
XCTAssertFalse(jsonR1 <= "你好")
|
||||
XCTAssertTrue(jsonL1 >= jsonR1)
|
||||
XCTAssertTrue(jsonL1 <= jsonR1)
|
||||
}
|
||||
|
||||
func testArray() {
|
||||
let jsonL1: JSON = [1, 2, "4", 5, "6"]
|
||||
let jsonR1: JSON = JSON([1, 2, "4", 5, "6"])
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 == [1, 2, "4", 5, "6"])
|
||||
XCTAssertTrue(jsonL1 != ["abcd", "efg"])
|
||||
XCTAssertTrue(jsonL1 >= jsonR1)
|
||||
XCTAssertTrue(jsonL1 <= jsonR1)
|
||||
XCTAssertFalse(jsonL1 > ["abcd", ""])
|
||||
XCTAssertFalse(jsonR1 < [])
|
||||
XCTAssertFalse(jsonL1 >= [:])
|
||||
}
|
||||
|
||||
func testDictionary() {
|
||||
let jsonL1: JSON = ["2": 2, "name": "Jack", "List": ["a", 1.09, NSNull()]]
|
||||
let jsonR1: JSON = JSON(["2": 2, "name": "Jack", "List": ["a", 1.09, NSNull()]])
|
||||
|
||||
XCTAssertEqual(jsonL1, jsonR1)
|
||||
XCTAssertTrue(jsonL1 != ["1": 2, "Hello": "World", "Koo": "Foo"])
|
||||
XCTAssertTrue(jsonL1 >= jsonR1)
|
||||
XCTAssertTrue(jsonL1 <= jsonR1)
|
||||
XCTAssertFalse(jsonL1 >= [:])
|
||||
XCTAssertFalse(jsonR1 <= ["999": "aaaa"])
|
||||
XCTAssertFalse(jsonL1 > [")(*&^": 1234567])
|
||||
XCTAssertFalse(jsonR1 < ["MNHH": "JUYTR"])
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
// DictionaryTests.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 DictionaryTests: XCTestCase {
|
||||
|
||||
func testGetter() {
|
||||
let dictionary = ["number": 9823.212, "name": "NAME", "list": [1234, 4.212], "object": ["sub_number": 877.2323, "sub_name": "sub_name"], "bool": true] as [String: Any]
|
||||
let json = JSON(dictionary)
|
||||
//dictionary
|
||||
XCTAssertEqual((json.dictionary!["number"]! as JSON).double!, 9823.212)
|
||||
XCTAssertEqual((json.dictionary!["name"]! as JSON).string!, "NAME")
|
||||
XCTAssertEqual(((json.dictionary!["list"]! as JSON).array![0] as JSON).int!, 1234)
|
||||
XCTAssertEqual(((json.dictionary!["list"]! as JSON).array![1] as JSON).double!, 4.212)
|
||||
XCTAssertEqual((((json.dictionary!["object"]! as JSON).dictionaryValue)["sub_number"]! as JSON).double!, 877.2323)
|
||||
XCTAssertTrue(json.dictionary!["null"] == nil)
|
||||
//dictionaryValue
|
||||
XCTAssertEqual(((((json.dictionaryValue)["object"]! as JSON).dictionaryValue)["sub_name"]! as JSON).string!, "sub_name")
|
||||
XCTAssertEqual((json.dictionaryValue["bool"]! as JSON).bool!, true)
|
||||
XCTAssertTrue(json.dictionaryValue["null"] == nil)
|
||||
XCTAssertTrue(JSON.null.dictionaryValue == [:])
|
||||
//dictionaryObject
|
||||
XCTAssertEqual(json.dictionaryObject!["number"]! as? Double, 9823.212)
|
||||
XCTAssertTrue(json.dictionaryObject!["null"] == nil)
|
||||
XCTAssertTrue(JSON.null.dictionaryObject == nil)
|
||||
}
|
||||
|
||||
func testSetter() {
|
||||
var json: JSON = ["test": "case"]
|
||||
XCTAssertEqual(json.dictionaryObject! as! [String: String], ["test": "case"])
|
||||
json.dictionaryObject = ["name": "NAME"]
|
||||
XCTAssertEqual(json.dictionaryObject! as! [String: String], ["name": "NAME"])
|
||||
}
|
||||
}
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
// LiteralConvertibleTests.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 LiteralConvertibleTests: XCTestCase {
|
||||
|
||||
func testNumber() {
|
||||
var json: JSON = 1234567890.876623
|
||||
XCTAssertEqual(json.int!, 1234567890)
|
||||
XCTAssertEqual(json.intValue, 1234567890)
|
||||
XCTAssertEqual(json.double!, 1234567890.876623)
|
||||
XCTAssertEqual(json.doubleValue, 1234567890.876623)
|
||||
XCTAssertTrue(json.float! == 1234567890.876623)
|
||||
XCTAssertTrue(json.floatValue == 1234567890.876623)
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
var jsonTrue: JSON = true
|
||||
XCTAssertEqual(jsonTrue.bool!, true)
|
||||
XCTAssertEqual(jsonTrue.boolValue, true)
|
||||
var jsonFalse: JSON = false
|
||||
XCTAssertEqual(jsonFalse.bool!, false)
|
||||
XCTAssertEqual(jsonFalse.boolValue, false)
|
||||
}
|
||||
|
||||
func testString() {
|
||||
var json: JSON = "abcd efg, HIJK;LMn"
|
||||
XCTAssertEqual(json.string!, "abcd efg, HIJK;LMn")
|
||||
XCTAssertEqual(json.stringValue, "abcd efg, HIJK;LMn")
|
||||
}
|
||||
|
||||
func testNil() {
|
||||
let jsonNil_1: JSON = JSON.null
|
||||
XCTAssert(jsonNil_1 == JSON.null)
|
||||
let jsonNil_2: JSON = JSON(NSNull.self)
|
||||
XCTAssert(jsonNil_2 != JSON.null)
|
||||
let jsonNil_3: JSON = JSON([1: 2])
|
||||
XCTAssert(jsonNil_3 != JSON.null)
|
||||
}
|
||||
|
||||
func testArray() {
|
||||
let json: JSON = [1, 2, "4", 5, "6"]
|
||||
XCTAssertEqual(json.array!, [1, 2, "4", 5, "6"])
|
||||
XCTAssertEqual(json.arrayValue, [1, 2, "4", 5, "6"])
|
||||
}
|
||||
|
||||
func testDictionary() {
|
||||
let json: JSON = ["1": 2, "2": 2, "three": 3, "list": ["aa", "bb", "dd"]]
|
||||
XCTAssertEqual(json.dictionary!, ["1": 2, "2": 2, "three": 3, "list": ["aa", "bb", "dd"]])
|
||||
XCTAssertEqual(json.dictionaryValue, ["1": 2, "2": 2, "three": 3, "list": ["aa", "bb", "dd"]])
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
// MergeTests.swift
|
||||
//
|
||||
// Created by Daniel Kiedrowski on 17.11.16.
|
||||
//
|
||||
// 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 MergeTests: XCTestCase {
|
||||
|
||||
func testDifferingTypes() {
|
||||
let A = JSON("a")
|
||||
let B = JSON(1)
|
||||
|
||||
do {
|
||||
_ = try A.merged(with: B)
|
||||
} catch let error as SwiftyJSONError {
|
||||
XCTAssertEqual(error.errorCode, SwiftyJSONError.wrongType.rawValue)
|
||||
XCTAssertEqual(type(of: error).errorDomain, SwiftyJSONError.errorDomain)
|
||||
XCTAssertEqual(error.errorUserInfo as! [String: String], [NSLocalizedDescriptionKey: "Couldn't merge, because the JSONs differ in type on top level."])
|
||||
} catch _ {}
|
||||
}
|
||||
|
||||
func testPrimitiveType() {
|
||||
let A = JSON("a")
|
||||
let B = JSON("b")
|
||||
XCTAssertEqual(try! A.merged(with: B), B)
|
||||
}
|
||||
|
||||
func testMergeEqual() {
|
||||
let json = JSON(["a": "A"])
|
||||
XCTAssertEqual(try! json.merged(with: json), json)
|
||||
}
|
||||
|
||||
func testMergeUnequalValues() {
|
||||
let A = JSON(["a": "A"])
|
||||
let B = JSON(["a": "B"])
|
||||
XCTAssertEqual(try! A.merged(with: B), B)
|
||||
}
|
||||
|
||||
func testMergeUnequalKeysAndValues() {
|
||||
let A = JSON(["a": "A"])
|
||||
let B = JSON(["b": "B"])
|
||||
XCTAssertEqual(try! A.merged(with: B), JSON(["a": "A", "b": "B"]))
|
||||
}
|
||||
|
||||
func testMergeFilledAndEmpty() {
|
||||
let A = JSON(["a": "A"])
|
||||
let B = JSON([:])
|
||||
XCTAssertEqual(try! A.merged(with: B), A)
|
||||
}
|
||||
|
||||
func testMergeEmptyAndFilled() {
|
||||
let A = JSON([:])
|
||||
let B = JSON(["a": "A"])
|
||||
XCTAssertEqual(try! A.merged(with: B), B)
|
||||
}
|
||||
|
||||
func testMergeArray() {
|
||||
let A = JSON(["a"])
|
||||
let B = JSON(["b"])
|
||||
XCTAssertEqual(try! A.merged(with: B), JSON(["a", "b"]))
|
||||
}
|
||||
|
||||
func testMergeNestedJSONs() {
|
||||
let A = JSON([
|
||||
"nested": [
|
||||
"A": "a"
|
||||
]
|
||||
])
|
||||
|
||||
let B = JSON([
|
||||
"nested": [
|
||||
"A": "b"
|
||||
]
|
||||
])
|
||||
|
||||
XCTAssertEqual(try! A.merged(with: B), B)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,148 @@
|
||||
// MutabilityTests.swift
|
||||
//
|
||||
// Copyright (c) 2014 - 2017 Zigii Wong
|
||||
//
|
||||
// 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 MutabilityTests: XCTestCase {
|
||||
|
||||
func testDictionaryMutability() {
|
||||
let dictionary: [String: Any] = [
|
||||
"string": "STRING",
|
||||
"number": 9823.212,
|
||||
"bool": true,
|
||||
"empty": ["nothing"],
|
||||
"foo": ["bar": ["1"]],
|
||||
"bar": ["foo": ["1": "a"]]
|
||||
]
|
||||
|
||||
var json = JSON(dictionary)
|
||||
XCTAssertEqual(json["string"], "STRING")
|
||||
XCTAssertEqual(json["number"], 9823.212)
|
||||
XCTAssertEqual(json["bool"], true)
|
||||
XCTAssertEqual(json["empty"], ["nothing"])
|
||||
|
||||
json["string"] = "muted"
|
||||
XCTAssertEqual(json["string"], "muted")
|
||||
|
||||
json["number"] = 9999.0
|
||||
XCTAssertEqual(json["number"], 9999.0)
|
||||
|
||||
json["bool"] = false
|
||||
XCTAssertEqual(json["bool"], false)
|
||||
|
||||
json["empty"] = []
|
||||
XCTAssertEqual(json["empty"], [])
|
||||
|
||||
json["new"] = JSON(["foo": "bar"])
|
||||
XCTAssertEqual(json["new"], ["foo": "bar"])
|
||||
|
||||
json["foo"]["bar"] = JSON([])
|
||||
XCTAssertEqual(json["foo"]["bar"], [])
|
||||
|
||||
json["bar"]["foo"] = JSON(["2": "b"])
|
||||
XCTAssertEqual(json["bar"]["foo"], ["2": "b"])
|
||||
}
|
||||
|
||||
func testArrayMutability() {
|
||||
let array: [Any] = ["1", "2", 3, true, []]
|
||||
|
||||
var json = JSON(array)
|
||||
XCTAssertEqual(json[0], "1")
|
||||
XCTAssertEqual(json[1], "2")
|
||||
XCTAssertEqual(json[2], 3)
|
||||
XCTAssertEqual(json[3], true)
|
||||
XCTAssertEqual(json[4], [])
|
||||
|
||||
json[0] = false
|
||||
XCTAssertEqual(json[0], false)
|
||||
|
||||
json[1] = 2
|
||||
XCTAssertEqual(json[1], 2)
|
||||
|
||||
json[2] = "3"
|
||||
XCTAssertEqual(json[2], "3")
|
||||
|
||||
json[3] = [:]
|
||||
XCTAssertEqual(json[3], [:])
|
||||
|
||||
json[4] = [1, 2]
|
||||
XCTAssertEqual(json[4], [1, 2])
|
||||
}
|
||||
|
||||
func testValueMutability() {
|
||||
var intArray = JSON([0, 1, 2])
|
||||
intArray[0] = JSON(55)
|
||||
XCTAssertEqual(intArray[0], 55)
|
||||
XCTAssertEqual(intArray[0].intValue, 55)
|
||||
|
||||
var dictionary = JSON(["foo": "bar"])
|
||||
dictionary["foo"] = JSON("foo")
|
||||
XCTAssertEqual(dictionary["foo"], "foo")
|
||||
XCTAssertEqual(dictionary["foo"].stringValue, "foo")
|
||||
|
||||
var number = JSON(1)
|
||||
number = JSON("111")
|
||||
XCTAssertEqual(number, "111")
|
||||
XCTAssertEqual(number.intValue, 111)
|
||||
XCTAssertEqual(number.stringValue, "111")
|
||||
|
||||
var boolean = JSON(true)
|
||||
boolean = JSON(false)
|
||||
XCTAssertEqual(boolean, false)
|
||||
XCTAssertEqual(boolean.boolValue, false)
|
||||
}
|
||||
|
||||
func testArrayRemovability() {
|
||||
let array = ["Test", "Test2", "Test3"]
|
||||
var json = JSON(array)
|
||||
|
||||
json.arrayObject?.removeFirst()
|
||||
XCTAssertEqual(false, json.arrayValue.isEmpty)
|
||||
XCTAssertEqual(json.arrayValue, ["Test2", "Test3"])
|
||||
|
||||
json.arrayObject?.removeLast()
|
||||
XCTAssertEqual(false, json.arrayValue.isEmpty)
|
||||
XCTAssertEqual(json.arrayValue, ["Test2"])
|
||||
|
||||
json.arrayObject?.removeAll()
|
||||
XCTAssertEqual(true, json.arrayValue.isEmpty)
|
||||
XCTAssertEqual(JSON([]), json)
|
||||
}
|
||||
|
||||
func testDictionaryRemovability() {
|
||||
let dictionary: [String: Any] = ["key1": "Value1", "key2": 2, "key3": true]
|
||||
var json = JSON(dictionary)
|
||||
|
||||
json.dictionaryObject?.removeValue(forKey: "key1")
|
||||
XCTAssertEqual(false, json.dictionaryValue.isEmpty)
|
||||
XCTAssertEqual(json.dictionaryValue, ["key2": 2, "key3": true])
|
||||
|
||||
json.dictionaryObject?.removeValue(forKey: "key3")
|
||||
XCTAssertEqual(false, json.dictionaryValue.isEmpty)
|
||||
XCTAssertEqual(json.dictionaryValue, ["key2": 2])
|
||||
|
||||
json.dictionaryObject?.removeAll()
|
||||
XCTAssertEqual(true, json.dictionaryValue.isEmpty)
|
||||
XCTAssertEqual(json.dictionaryValue, [:])
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
// NestedJSONTests.swift
|
||||
//
|
||||
// Created by Hector Matos on 9/27/16.
|
||||
//
|
||||
// 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 NestedJSONTests: XCTestCase {
|
||||
let family: JSON = [
|
||||
"names": [
|
||||
"Brooke Abigail Matos",
|
||||
"Rowan Danger Matos"
|
||||
],
|
||||
"motto": "Hey, I don't know about you, but I'm feeling twenty-two! So, release the KrakenDev!"
|
||||
]
|
||||
|
||||
func testTopLevelNestedJSON() {
|
||||
let nestedJSON: JSON = [
|
||||
"family": family
|
||||
]
|
||||
XCTAssertNotNil(try? nestedJSON.rawData())
|
||||
}
|
||||
|
||||
func testDeeplyNestedJSON() {
|
||||
let nestedFamily: JSON = [
|
||||
"count": 1,
|
||||
"families": [
|
||||
[
|
||||
"isACoolFamily": true,
|
||||
"family": [
|
||||
"hello": family
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
XCTAssertNotNil(try? nestedFamily.rawData())
|
||||
}
|
||||
|
||||
func testArrayJSON() {
|
||||
let arr: [JSON] = ["a", 1, ["b", 2]]
|
||||
let json = JSON(arr)
|
||||
XCTAssertEqual(json[0].string, "a")
|
||||
XCTAssertEqual(json[2, 1].int, 2)
|
||||
}
|
||||
|
||||
func testDictionaryJSON() {
|
||||
let json: JSON = ["a": JSON("1"), "b": JSON([1, 2, "3"]), "c": JSON(["aa": "11", "bb": 22])]
|
||||
XCTAssertEqual(json["a"].string, "1")
|
||||
XCTAssertEqual(json["b"].array!, [1, 2, "3"])
|
||||
XCTAssertEqual(json["c"]["aa"].string, "11")
|
||||
}
|
||||
|
||||
func testNestedJSON() {
|
||||
let inner = JSON([
|
||||
"some_field": "1" + "2"
|
||||
])
|
||||
let json = JSON([
|
||||
"outer_field": "1" + "2",
|
||||
"inner_json": inner
|
||||
])
|
||||
XCTAssertEqual(json["inner_json"], ["some_field": "12"])
|
||||
|
||||
let foo = "foo"
|
||||
let json2 = JSON([
|
||||
"outer_field": foo,
|
||||
"inner_json": inner
|
||||
])
|
||||
XCTAssertEqual(json2["inner_json"].rawValue as! [String: String], ["some_field": "12"])
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,387 @@
|
||||
// NumberTests.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 NumberTests: XCTestCase {
|
||||
|
||||
func testNumber() {
|
||||
//getter
|
||||
var json = JSON(NSNumber(value: 9876543210.123456789))
|
||||
XCTAssertEqual(json.number!, 9876543210.123456789)
|
||||
XCTAssertEqual(json.numberValue, 9876543210.123456789)
|
||||
XCTAssertEqual(json.stringValue, "9876543210.123457")
|
||||
|
||||
json.string = "1000000000000000000000000000.1"
|
||||
XCTAssertNil(json.number)
|
||||
XCTAssertEqual(json.numberValue.description, "1000000000000000000000000000.1")
|
||||
|
||||
json.string = "1e+27"
|
||||
XCTAssertEqual(json.numberValue.description, "1000000000000000000000000000")
|
||||
|
||||
//setter
|
||||
json.number = NSNumber(value: 123456789.0987654321)
|
||||
XCTAssertEqual(json.number!, 123456789.0987654321)
|
||||
XCTAssertEqual(json.numberValue, 123456789.0987654321)
|
||||
|
||||
json.number = nil
|
||||
XCTAssertEqual(json.numberValue, 0)
|
||||
XCTAssertEqual(json.object as? NSNull, NSNull())
|
||||
XCTAssertTrue(json.number == nil)
|
||||
|
||||
json.numberValue = 2.9876
|
||||
XCTAssertEqual(json.number!, 2.9876)
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
var json = JSON(true)
|
||||
XCTAssertEqual(json.bool!, true)
|
||||
XCTAssertEqual(json.boolValue, true)
|
||||
XCTAssertEqual(json.numberValue, true as NSNumber)
|
||||
XCTAssertEqual(json.stringValue, "true")
|
||||
|
||||
json.bool = false
|
||||
XCTAssertEqual(json.bool!, false)
|
||||
XCTAssertEqual(json.boolValue, false)
|
||||
XCTAssertEqual(json.numberValue, false as NSNumber)
|
||||
|
||||
json.bool = nil
|
||||
XCTAssertTrue(json.bool == nil)
|
||||
XCTAssertEqual(json.boolValue, false)
|
||||
XCTAssertEqual(json.numberValue, 0)
|
||||
|
||||
json.boolValue = true
|
||||
XCTAssertEqual(json.bool!, true)
|
||||
XCTAssertEqual(json.boolValue, true)
|
||||
XCTAssertEqual(json.numberValue, true as NSNumber)
|
||||
}
|
||||
|
||||
func testDouble() {
|
||||
var json = JSON(9876543210.123456789)
|
||||
XCTAssertEqual(json.double!, 9876543210.123456789)
|
||||
XCTAssertEqual(json.doubleValue, 9876543210.123456789)
|
||||
XCTAssertEqual(json.numberValue, 9876543210.123456789)
|
||||
XCTAssertEqual(json.stringValue, "9876543210.123457")
|
||||
|
||||
json.double = 2.8765432
|
||||
XCTAssertEqual(json.double!, 2.8765432)
|
||||
XCTAssertEqual(json.doubleValue, 2.8765432)
|
||||
XCTAssertEqual(json.numberValue, 2.8765432)
|
||||
|
||||
json.doubleValue = 89.0987654
|
||||
XCTAssertEqual(json.double!, 89.0987654)
|
||||
XCTAssertEqual(json.doubleValue, 89.0987654)
|
||||
XCTAssertEqual(json.numberValue, 89.0987654)
|
||||
|
||||
json.double = nil
|
||||
XCTAssertEqual(json.boolValue, false)
|
||||
XCTAssertEqual(json.doubleValue, 0.0)
|
||||
XCTAssertEqual(json.numberValue, 0)
|
||||
}
|
||||
|
||||
func testFloat() {
|
||||
var json = JSON(54321.12345)
|
||||
XCTAssertTrue(json.float! == 54321.12345)
|
||||
XCTAssertTrue(json.floatValue == 54321.12345)
|
||||
XCTAssertEqual(json.numberValue, 54321.12345)
|
||||
XCTAssertEqual(json.stringValue, "54321.12345")
|
||||
|
||||
json.double = 23231.65
|
||||
XCTAssertTrue(json.float! == 23231.65)
|
||||
XCTAssertTrue(json.floatValue == 23231.65)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 23231.65))
|
||||
|
||||
json.double = -98766.23
|
||||
XCTAssertEqual(json.float!, -98766.23)
|
||||
XCTAssertEqual(json.floatValue, -98766.23)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: -98766.23))
|
||||
}
|
||||
|
||||
func testInt() {
|
||||
var json = JSON(123456789)
|
||||
XCTAssertEqual(json.int!, 123456789)
|
||||
XCTAssertEqual(json.intValue, 123456789)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 123456789))
|
||||
XCTAssertEqual(json.stringValue, "123456789")
|
||||
|
||||
json.int = nil
|
||||
XCTAssertTrue(json.boolValue == false)
|
||||
XCTAssertTrue(json.intValue == 0)
|
||||
XCTAssertEqual(json.numberValue, 0)
|
||||
XCTAssertEqual(json.object as? NSNull, NSNull())
|
||||
XCTAssertTrue(json.int == nil)
|
||||
|
||||
json.intValue = 76543
|
||||
XCTAssertEqual(json.int!, 76543)
|
||||
XCTAssertEqual(json.intValue, 76543)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 76543))
|
||||
|
||||
json.intValue = 98765421
|
||||
XCTAssertEqual(json.int!, 98765421)
|
||||
XCTAssertEqual(json.intValue, 98765421)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 98765421))
|
||||
}
|
||||
|
||||
func testUInt() {
|
||||
var json = JSON(123456789)
|
||||
XCTAssertTrue(json.uInt! == 123456789)
|
||||
XCTAssertTrue(json.uIntValue == 123456789)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 123456789))
|
||||
XCTAssertEqual(json.stringValue, "123456789")
|
||||
|
||||
json.uInt = nil
|
||||
XCTAssertTrue(json.boolValue == false)
|
||||
XCTAssertTrue(json.uIntValue == 0)
|
||||
XCTAssertEqual(json.numberValue, 0)
|
||||
XCTAssertEqual(json.object as? NSNull, NSNull())
|
||||
XCTAssertTrue(json.uInt == nil)
|
||||
|
||||
json.uIntValue = 76543
|
||||
XCTAssertTrue(json.uInt! == 76543)
|
||||
XCTAssertTrue(json.uIntValue == 76543)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 76543))
|
||||
|
||||
json.uIntValue = 98765421
|
||||
XCTAssertTrue(json.uInt! == 98765421)
|
||||
XCTAssertTrue(json.uIntValue == 98765421)
|
||||
XCTAssertEqual(json.numberValue, NSNumber(value: 98765421))
|
||||
}
|
||||
|
||||
func testInt8() {
|
||||
let n127 = NSNumber(value: 127)
|
||||
var json = JSON(n127)
|
||||
XCTAssertTrue(json.int8! == n127.int8Value)
|
||||
XCTAssertTrue(json.int8Value == n127.int8Value)
|
||||
XCTAssertTrue(json.number! == n127)
|
||||
XCTAssertEqual(json.numberValue, n127)
|
||||
XCTAssertEqual(json.stringValue, "127")
|
||||
|
||||
let nm128 = NSNumber(value: -128)
|
||||
json.int8Value = nm128.int8Value
|
||||
XCTAssertTrue(json.int8! == nm128.int8Value)
|
||||
XCTAssertTrue(json.int8Value == nm128.int8Value)
|
||||
XCTAssertTrue(json.number! == nm128)
|
||||
XCTAssertEqual(json.numberValue, nm128)
|
||||
XCTAssertEqual(json.stringValue, "-128")
|
||||
|
||||
let n0 = NSNumber(value: 0 as Int8)
|
||||
json.int8Value = n0.int8Value
|
||||
XCTAssertTrue(json.int8! == n0.int8Value)
|
||||
XCTAssertTrue(json.int8Value == n0.int8Value)
|
||||
XCTAssertTrue(json.number! == n0)
|
||||
XCTAssertEqual(json.numberValue, n0)
|
||||
XCTAssertEqual(json.stringValue, "0")
|
||||
|
||||
let n1 = NSNumber(value: 1 as Int8)
|
||||
json.int8Value = n1.int8Value
|
||||
XCTAssertTrue(json.int8! == n1.int8Value)
|
||||
XCTAssertTrue(json.int8Value == n1.int8Value)
|
||||
XCTAssertTrue(json.number! == n1)
|
||||
XCTAssertEqual(json.numberValue, n1)
|
||||
XCTAssertEqual(json.stringValue, "1")
|
||||
}
|
||||
|
||||
func testUInt8() {
|
||||
let n255 = NSNumber(value: 255)
|
||||
var json = JSON(n255)
|
||||
XCTAssertTrue(json.uInt8! == n255.uint8Value)
|
||||
XCTAssertTrue(json.uInt8Value == n255.uint8Value)
|
||||
XCTAssertTrue(json.number! == n255)
|
||||
XCTAssertEqual(json.numberValue, n255)
|
||||
XCTAssertEqual(json.stringValue, "255")
|
||||
|
||||
let nm2 = NSNumber(value: 2)
|
||||
json.uInt8Value = nm2.uint8Value
|
||||
XCTAssertTrue(json.uInt8! == nm2.uint8Value)
|
||||
XCTAssertTrue(json.uInt8Value == nm2.uint8Value)
|
||||
XCTAssertTrue(json.number! == nm2)
|
||||
XCTAssertEqual(json.numberValue, nm2)
|
||||
XCTAssertEqual(json.stringValue, "2")
|
||||
|
||||
let nm0 = NSNumber(value: 0)
|
||||
json.uInt8Value = nm0.uint8Value
|
||||
XCTAssertTrue(json.uInt8! == nm0.uint8Value)
|
||||
XCTAssertTrue(json.uInt8Value == nm0.uint8Value)
|
||||
XCTAssertTrue(json.number! == nm0)
|
||||
XCTAssertEqual(json.numberValue, nm0)
|
||||
XCTAssertEqual(json.stringValue, "0")
|
||||
|
||||
let nm1 = NSNumber(value: 1)
|
||||
json.uInt8 = nm1.uint8Value
|
||||
XCTAssertTrue(json.uInt8! == nm1.uint8Value)
|
||||
XCTAssertTrue(json.uInt8Value == nm1.uint8Value)
|
||||
XCTAssertTrue(json.number! == nm1)
|
||||
XCTAssertEqual(json.numberValue, nm1)
|
||||
XCTAssertEqual(json.stringValue, "1")
|
||||
}
|
||||
|
||||
func testInt16() {
|
||||
|
||||
let n32767 = NSNumber(value: 32767)
|
||||
var json = JSON(n32767)
|
||||
XCTAssertTrue(json.int16! == n32767.int16Value)
|
||||
XCTAssertTrue(json.int16Value == n32767.int16Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
|
||||
let nm32768 = NSNumber(value: -32768)
|
||||
json.int16Value = nm32768.int16Value
|
||||
XCTAssertTrue(json.int16! == nm32768.int16Value)
|
||||
XCTAssertTrue(json.int16Value == nm32768.int16Value)
|
||||
XCTAssertTrue(json.number! == nm32768)
|
||||
XCTAssertEqual(json.numberValue, nm32768)
|
||||
XCTAssertEqual(json.stringValue, "-32768")
|
||||
|
||||
let n0 = NSNumber(value: 0)
|
||||
json.int16Value = n0.int16Value
|
||||
XCTAssertTrue(json.int16! == n0.int16Value)
|
||||
XCTAssertTrue(json.int16Value == n0.int16Value)
|
||||
XCTAssertEqual(json.number, n0)
|
||||
XCTAssertEqual(json.numberValue, n0)
|
||||
XCTAssertEqual(json.stringValue, "0")
|
||||
|
||||
let n1 = NSNumber(value: 1)
|
||||
json.int16 = n1.int16Value
|
||||
XCTAssertTrue(json.int16! == n1.int16Value)
|
||||
XCTAssertTrue(json.int16Value == n1.int16Value)
|
||||
XCTAssertTrue(json.number! == n1)
|
||||
XCTAssertEqual(json.numberValue, n1)
|
||||
XCTAssertEqual(json.stringValue, "1")
|
||||
}
|
||||
|
||||
func testUInt16() {
|
||||
|
||||
let n65535 = NSNumber(value: 65535)
|
||||
var json = JSON(n65535)
|
||||
XCTAssertTrue(json.uInt16! == n65535.uint16Value)
|
||||
XCTAssertTrue(json.uInt16Value == n65535.uint16Value)
|
||||
XCTAssertTrue(json.number! == n65535)
|
||||
XCTAssertEqual(json.numberValue, n65535)
|
||||
XCTAssertEqual(json.stringValue, "65535")
|
||||
|
||||
let n32767 = NSNumber(value: 32767)
|
||||
json.uInt16 = n32767.uint16Value
|
||||
XCTAssertTrue(json.uInt16! == n32767.uint16Value)
|
||||
XCTAssertTrue(json.uInt16Value == n32767.uint16Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
}
|
||||
|
||||
func testInt32() {
|
||||
let n2147483647 = NSNumber(value: 2147483647)
|
||||
var json = JSON(n2147483647)
|
||||
XCTAssertTrue(json.int32! == n2147483647.int32Value)
|
||||
XCTAssertTrue(json.int32Value == n2147483647.int32Value)
|
||||
XCTAssertTrue(json.number! == n2147483647)
|
||||
XCTAssertEqual(json.numberValue, n2147483647)
|
||||
XCTAssertEqual(json.stringValue, "2147483647")
|
||||
|
||||
let n32767 = NSNumber(value: 32767)
|
||||
json.int32 = n32767.int32Value
|
||||
XCTAssertTrue(json.int32! == n32767.int32Value)
|
||||
XCTAssertTrue(json.int32Value == n32767.int32Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
|
||||
let nm2147483648 = NSNumber(value: -2147483648)
|
||||
json.int32Value = nm2147483648.int32Value
|
||||
XCTAssertTrue(json.int32! == nm2147483648.int32Value)
|
||||
XCTAssertTrue(json.int32Value == nm2147483648.int32Value)
|
||||
XCTAssertTrue(json.number! == nm2147483648)
|
||||
XCTAssertEqual(json.numberValue, nm2147483648)
|
||||
XCTAssertEqual(json.stringValue, "-2147483648")
|
||||
}
|
||||
|
||||
func testUInt32() {
|
||||
let n2147483648 = NSNumber(value: 2147483648 as UInt32)
|
||||
var json = JSON(n2147483648)
|
||||
XCTAssertTrue(json.uInt32! == n2147483648.uint32Value)
|
||||
XCTAssertTrue(json.uInt32Value == n2147483648.uint32Value)
|
||||
XCTAssertTrue(json.number! == n2147483648)
|
||||
XCTAssertEqual(json.numberValue, n2147483648)
|
||||
XCTAssertEqual(json.stringValue, "2147483648")
|
||||
|
||||
let n32767 = NSNumber(value: 32767 as UInt32)
|
||||
json.uInt32 = n32767.uint32Value
|
||||
XCTAssertTrue(json.uInt32! == n32767.uint32Value)
|
||||
XCTAssertTrue(json.uInt32Value == n32767.uint32Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
|
||||
let n0 = NSNumber(value: 0 as UInt32)
|
||||
json.uInt32Value = n0.uint32Value
|
||||
XCTAssertTrue(json.uInt32! == n0.uint32Value)
|
||||
XCTAssertTrue(json.uInt32Value == n0.uint32Value)
|
||||
XCTAssertTrue(json.number! == n0)
|
||||
XCTAssertEqual(json.numberValue, n0)
|
||||
XCTAssertEqual(json.stringValue, "0")
|
||||
}
|
||||
|
||||
func testInt64() {
|
||||
let int64Max = NSNumber(value: INT64_MAX)
|
||||
var json = JSON(int64Max)
|
||||
XCTAssertTrue(json.int64! == int64Max.int64Value)
|
||||
XCTAssertTrue(json.int64Value == int64Max.int64Value)
|
||||
XCTAssertTrue(json.number! == int64Max)
|
||||
XCTAssertEqual(json.numberValue, int64Max)
|
||||
XCTAssertEqual(json.stringValue, int64Max.stringValue)
|
||||
|
||||
let n32767 = NSNumber(value: 32767)
|
||||
json.int64 = n32767.int64Value
|
||||
XCTAssertTrue(json.int64! == n32767.int64Value)
|
||||
XCTAssertTrue(json.int64Value == n32767.int64Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
|
||||
let int64Min = NSNumber(value: (INT64_MAX-1) * -1)
|
||||
json.int64Value = int64Min.int64Value
|
||||
XCTAssertTrue(json.int64! == int64Min.int64Value)
|
||||
XCTAssertTrue(json.int64Value == int64Min.int64Value)
|
||||
XCTAssertTrue(json.number! == int64Min)
|
||||
XCTAssertEqual(json.numberValue, int64Min)
|
||||
XCTAssertEqual(json.stringValue, int64Min.stringValue)
|
||||
}
|
||||
|
||||
func testUInt64() {
|
||||
let uInt64Max = NSNumber(value: UINT64_MAX)
|
||||
var json = JSON(uInt64Max)
|
||||
XCTAssertTrue(json.uInt64! == uInt64Max.uint64Value)
|
||||
XCTAssertTrue(json.uInt64Value == uInt64Max.uint64Value)
|
||||
XCTAssertTrue(json.number! == uInt64Max)
|
||||
XCTAssertEqual(json.numberValue, uInt64Max)
|
||||
XCTAssertEqual(json.stringValue, uInt64Max.stringValue)
|
||||
|
||||
let n32767 = NSNumber(value: 32767)
|
||||
json.int64 = n32767.int64Value
|
||||
XCTAssertTrue(json.int64! == n32767.int64Value)
|
||||
XCTAssertTrue(json.int64Value == n32767.int64Value)
|
||||
XCTAssertTrue(json.number! == n32767)
|
||||
XCTAssertEqual(json.numberValue, n32767)
|
||||
XCTAssertEqual(json.stringValue, "32767")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
// 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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,124 @@
|
||||
// PrintableTests.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 PrintableTests: XCTestCase {
|
||||
func testNumber() {
|
||||
let json: JSON = 1234567890.876623
|
||||
XCTAssertEqual(json.description, "1234567890.876623")
|
||||
XCTAssertEqual(json.debugDescription, "1234567890.876623")
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
let jsonTrue: JSON = true
|
||||
XCTAssertEqual(jsonTrue.description, "true")
|
||||
XCTAssertEqual(jsonTrue.debugDescription, "true")
|
||||
let jsonFalse: JSON = false
|
||||
XCTAssertEqual(jsonFalse.description, "false")
|
||||
XCTAssertEqual(jsonFalse.debugDescription, "false")
|
||||
}
|
||||
|
||||
func testString() {
|
||||
let json: JSON = "abcd efg, HIJK;LMn"
|
||||
XCTAssertEqual(json.description, "abcd efg, HIJK;LMn")
|
||||
XCTAssertEqual(json.debugDescription, "abcd efg, HIJK;LMn")
|
||||
}
|
||||
|
||||
func testNil() {
|
||||
let jsonNil_1: JSON = JSON.null
|
||||
XCTAssertEqual(jsonNil_1.description, "null")
|
||||
XCTAssertEqual(jsonNil_1.debugDescription, "null")
|
||||
let jsonNil_2: JSON = JSON(NSNull())
|
||||
XCTAssertEqual(jsonNil_2.description, "null")
|
||||
XCTAssertEqual(jsonNil_2.debugDescription, "null")
|
||||
}
|
||||
|
||||
func testArray() {
|
||||
let json: JSON = [1, 2, "4", 5, "6"]
|
||||
var description = json.description.replacingOccurrences(of: "\n", with: "")
|
||||
description = description.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertEqual(description, "[1,2,\"4\",5,\"6\"]")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
XCTAssertTrue(json.debugDescription.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
}
|
||||
|
||||
func testArrayWithStrings() {
|
||||
let array = ["\"123\""]
|
||||
let json = JSON(array)
|
||||
var description = json.description.replacingOccurrences(of: "\n", with: "")
|
||||
description = description.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertEqual(description, "[\"\\\"123\\\"\"]")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
XCTAssertTrue(json.debugDescription.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
}
|
||||
|
||||
func testArrayWithOptionals() {
|
||||
let array = [1, 2, "4", 5, "6", nil] as [Any?]
|
||||
let json = JSON(array)
|
||||
guard var description = json.rawString([.castNilToNSNull: true]) else {
|
||||
XCTFail("could not represent array")
|
||||
return
|
||||
}
|
||||
description = description.replacingOccurrences(of: "\n", with: "")
|
||||
description = description.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertEqual(description, "[1,2,\"4\",5,\"6\",null]")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
XCTAssertTrue(json.debugDescription.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
}
|
||||
|
||||
func testDictionary() {
|
||||
let json: JSON = ["1": 2, "2": "two", "3": 3]
|
||||
var debugDescription = json.debugDescription.replacingOccurrences(of: "\n", with: "")
|
||||
debugDescription = debugDescription.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
XCTAssertTrue(debugDescription.range(of: "\"1\":2", options: String.CompareOptions.caseInsensitive) != nil)
|
||||
XCTAssertTrue(debugDescription.range(of: "\"2\":\"two\"", options: String.CompareOptions.caseInsensitive) != nil)
|
||||
XCTAssertTrue(debugDescription.range(of: "\"3\":3", options: String.CompareOptions.caseInsensitive) != nil)
|
||||
}
|
||||
|
||||
func testDictionaryWithStrings() {
|
||||
let dict = ["foo": "{\"bar\":123}"] as [String: Any]
|
||||
let json = JSON(dict)
|
||||
var debugDescription = json.debugDescription.replacingOccurrences(of: "\n", with: "")
|
||||
debugDescription = debugDescription.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
let exceptedResult = "{\"foo\":\"{\\\"bar\\\":123}\"}"
|
||||
XCTAssertEqual(debugDescription, exceptedResult)
|
||||
}
|
||||
|
||||
func testDictionaryWithOptionals() {
|
||||
let dict = ["1": 2, "2": "two", "3": nil] as [String: Any?]
|
||||
let json = JSON(dict)
|
||||
guard var description = json.rawString([.castNilToNSNull: true]) else {
|
||||
XCTFail("could not represent dictionary")
|
||||
return
|
||||
}
|
||||
description = description.replacingOccurrences(of: "\n", with: "")
|
||||
description = description.replacingOccurrences(of: " ", with: "")
|
||||
XCTAssertTrue(json.description.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
XCTAssertTrue(description.range(of: "\"1\":2", options: NSString.CompareOptions.caseInsensitive) != nil)
|
||||
XCTAssertTrue(description.range(of: "\"2\":\"two\"", options: NSString.CompareOptions.caseInsensitive) != nil)
|
||||
XCTAssertTrue(description.range(of: "\"3\":null", options: NSString.CompareOptions.caseInsensitive) != nil)
|
||||
}
|
||||
}
|
||||
+108
@@ -0,0 +1,108 @@
|
||||
// RawRepresentableTests.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 RawRepresentableTests: XCTestCase {
|
||||
|
||||
func testNumber() {
|
||||
var json: JSON = JSON(rawValue: 948394394.347384 as NSNumber)!
|
||||
XCTAssertEqual(json.int!, 948394394)
|
||||
XCTAssertEqual(json.intValue, 948394394)
|
||||
XCTAssertEqual(json.double!, 948394394.347384)
|
||||
XCTAssertEqual(json.doubleValue, 948394394.347384)
|
||||
XCTAssertEqual(json.float!, 948394394.347384)
|
||||
XCTAssertEqual(json.floatValue, 948394394.347384)
|
||||
|
||||
let object: Any = json.rawValue
|
||||
if let int = object as? Int {
|
||||
XCTAssertEqual(int, 948394394)
|
||||
}
|
||||
XCTAssertEqual(object as? Double, 948394394.347384)
|
||||
if let float = object as? Float {
|
||||
XCTAssertEqual(float, 948394394.347384)
|
||||
}
|
||||
XCTAssertEqual(object as? NSNumber, 948394394.347384)
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
var jsonTrue: JSON = JSON(rawValue: true as NSNumber)!
|
||||
XCTAssertEqual(jsonTrue.bool!, true)
|
||||
XCTAssertEqual(jsonTrue.boolValue, true)
|
||||
|
||||
var jsonFalse: JSON = JSON(rawValue: false)!
|
||||
XCTAssertEqual(jsonFalse.bool!, false)
|
||||
XCTAssertEqual(jsonFalse.boolValue, false)
|
||||
|
||||
let objectTrue = jsonTrue.rawValue
|
||||
XCTAssertEqual(objectTrue as? Bool, true)
|
||||
|
||||
let objectFalse = jsonFalse.rawValue
|
||||
XCTAssertEqual(objectFalse as? Bool, false)
|
||||
}
|
||||
|
||||
func testString() {
|
||||
let string = "The better way to deal with JSON data in Swift."
|
||||
if let json: JSON = JSON(rawValue: string) {
|
||||
XCTAssertEqual(json.string!, string)
|
||||
XCTAssertEqual(json.stringValue, string)
|
||||
XCTAssertTrue(json.array == nil)
|
||||
XCTAssertTrue(json.dictionary == nil)
|
||||
XCTAssertTrue(json.null == nil)
|
||||
XCTAssertTrue(json.error == nil)
|
||||
XCTAssertTrue(json.type == .string)
|
||||
XCTAssertEqual(json.object as? String, string)
|
||||
} else {
|
||||
XCTFail("Should not run into here")
|
||||
}
|
||||
|
||||
let object: Any = JSON(rawValue: string)!.rawValue
|
||||
XCTAssertEqual(object as? String, string)
|
||||
}
|
||||
|
||||
func testNil() {
|
||||
if JSON(rawValue: NSObject()) != nil {
|
||||
XCTFail("Should not run into here")
|
||||
}
|
||||
}
|
||||
|
||||
func testArray() {
|
||||
let array = [1, 2, "3", 4102, "5632", "abocde", "!@# $%^&*()"] as NSArray
|
||||
if let json: JSON = JSON(rawValue: array) {
|
||||
XCTAssertEqual(json, JSON(array))
|
||||
}
|
||||
|
||||
let object: Any = JSON(rawValue: array)!.rawValue
|
||||
XCTAssertTrue(array == object as! NSArray)
|
||||
}
|
||||
|
||||
func testDictionary() {
|
||||
let dictionary = ["1": 2, "2": 2, "three": 3, "list": ["aa", "bb", "dd"]] as NSDictionary
|
||||
if let json: JSON = JSON(rawValue: dictionary) {
|
||||
XCTAssertEqual(json, JSON(dictionary))
|
||||
}
|
||||
|
||||
let object: Any = JSON(rawValue: dictionary)!.rawValue
|
||||
XCTAssertTrue(dictionary == object as! NSDictionary)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
// RawTests.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 RawTests: XCTestCase {
|
||||
|
||||
func testRawData() {
|
||||
let json: JSON = ["somekey": "some string value"]
|
||||
let expectedRawData = "{\"somekey\":\"some string value\"}".data(using: String.Encoding.utf8)
|
||||
do {
|
||||
let data: Data = try json.rawData()
|
||||
XCTAssertEqual(expectedRawData, data)
|
||||
} catch _ {}
|
||||
}
|
||||
|
||||
func testInvalidJSONForRawData() {
|
||||
let json: JSON = "...<nonsense>xyz</nonsense>"
|
||||
do {
|
||||
_ = try json.rawData()
|
||||
} catch let error as SwiftyJSONError {
|
||||
XCTAssertEqual(error, SwiftyJSONError.invalidJSON)
|
||||
} catch _ {}
|
||||
}
|
||||
|
||||
func testArray() {
|
||||
let json: JSON = [1, "2", 3.12, NSNull(), true, ["name": "Jack"]]
|
||||
let data: Data?
|
||||
do {
|
||||
data = try json.rawData()
|
||||
} catch _ {
|
||||
data = nil
|
||||
}
|
||||
let string = json.rawString()
|
||||
XCTAssertTrue (data != nil)
|
||||
XCTAssertTrue (string!.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
}
|
||||
|
||||
func testDictionary() {
|
||||
let json: JSON = ["number": 111111.23456789, "name": "Jack", "list": [1, 2, 3, 4], "bool": false, "null": NSNull()]
|
||||
let data: Data?
|
||||
do {
|
||||
data = try json.rawData()
|
||||
} catch _ {
|
||||
data = nil
|
||||
}
|
||||
let string = json.rawString()
|
||||
XCTAssertTrue (data != nil)
|
||||
XCTAssertTrue (string!.lengthOfBytes(using: String.Encoding.utf8) > 0)
|
||||
}
|
||||
|
||||
func testString() {
|
||||
let json: JSON = "I'm a json"
|
||||
XCTAssertEqual(json.rawString(), "I'm a json")
|
||||
}
|
||||
|
||||
func testNumber() {
|
||||
let json: JSON = 123456789.123
|
||||
XCTAssertEqual(json.rawString(), "123456789.123")
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
let json: JSON = true
|
||||
XCTAssertEqual(json.rawString(), "true")
|
||||
}
|
||||
|
||||
func testNull() {
|
||||
let json: JSON = JSON.null
|
||||
XCTAssertEqual(json.rawString(), "null")
|
||||
}
|
||||
|
||||
func testNestedJSON() {
|
||||
let inner: JSON = ["name": "john doe"]
|
||||
let json: JSON = ["level": 1337, "user": inner]
|
||||
let data: Data?
|
||||
do {
|
||||
data = try json.rawData()
|
||||
} catch _ {
|
||||
data = nil
|
||||
}
|
||||
let string = json.rawString()
|
||||
XCTAssertNotNil(data)
|
||||
XCTAssertNotNil(string)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,240 @@
|
||||
// SequenceTypeTests.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 SequenceTypeTests: XCTestCase {
|
||||
|
||||
func testJSONFile() {
|
||||
if let file = Bundle(for: BaseTests.self).path(forResource: "Tests", ofType: "json") {
|
||||
let testData = try? Data(contentsOf: URL(fileURLWithPath: file))
|
||||
guard let json = try? JSON(data: testData!) else {
|
||||
XCTFail("Unable to parse the data")
|
||||
return
|
||||
}
|
||||
for (index, sub) in json {
|
||||
switch (index as NSString).integerValue {
|
||||
case 0:
|
||||
XCTAssertTrue(sub["id_str"] == "240558470661799936")
|
||||
case 1:
|
||||
XCTAssertTrue(sub["id_str"] == "240556426106372096")
|
||||
case 2:
|
||||
XCTAssertTrue(sub["id_str"] == "240539141056638977")
|
||||
default:
|
||||
continue
|
||||
}
|
||||
}
|
||||
} else {
|
||||
XCTFail("Can't find the test JSON file")
|
||||
}
|
||||
}
|
||||
|
||||
func testArrayAllNumber() {
|
||||
var json: JSON = [1, 2.0, 3.3, 123456789, 987654321.123456789]
|
||||
XCTAssertEqual(json.count, 5)
|
||||
|
||||
var index = 0
|
||||
var array = [NSNumber]()
|
||||
for (i, sub) in json {
|
||||
XCTAssertEqual(sub, json[index])
|
||||
XCTAssertEqual(i, "\(index)")
|
||||
array.append(sub.number!)
|
||||
index += 1
|
||||
}
|
||||
XCTAssertEqual(index, 5)
|
||||
XCTAssertEqual(array, [1, 2.0, 3.3, 123456789, 987654321.123456789])
|
||||
}
|
||||
|
||||
func testArrayAllBool() {
|
||||
var json: JSON = JSON([true, false, false, true, true])
|
||||
XCTAssertEqual(json.count, 5)
|
||||
|
||||
var index = 0
|
||||
var array = [Bool]()
|
||||
for (i, sub) in json {
|
||||
XCTAssertEqual(sub, json[index])
|
||||
XCTAssertEqual(i, "\(index)")
|
||||
array.append(sub.bool!)
|
||||
index += 1
|
||||
}
|
||||
XCTAssertEqual(index, 5)
|
||||
XCTAssertEqual(array, [true, false, false, true, true])
|
||||
}
|
||||
|
||||
func testArrayAllString() {
|
||||
var json: JSON = JSON(rawValue: ["aoo", "bpp", "zoo"] as NSArray)!
|
||||
XCTAssertEqual(json.count, 3)
|
||||
|
||||
var index = 0
|
||||
var array = [String]()
|
||||
for (i, sub) in json {
|
||||
XCTAssertEqual(sub, json[index])
|
||||
XCTAssertEqual(i, "\(index)")
|
||||
array.append(sub.string!)
|
||||
index += 1
|
||||
}
|
||||
XCTAssertEqual(index, 3)
|
||||
XCTAssertEqual(array, ["aoo", "bpp", "zoo"])
|
||||
}
|
||||
|
||||
func testArrayWithNull() {
|
||||
var json: JSON = JSON(rawValue: ["aoo", "bpp", NSNull(), "zoo"] as NSArray)!
|
||||
XCTAssertEqual(json.count, 4)
|
||||
|
||||
var index = 0
|
||||
var array = [AnyObject]()
|
||||
for (i, sub) in json {
|
||||
XCTAssertEqual(sub, json[index])
|
||||
XCTAssertEqual(i, "\(index)")
|
||||
array.append(sub.object as AnyObject)
|
||||
index += 1
|
||||
}
|
||||
XCTAssertEqual(index, 4)
|
||||
XCTAssertEqual(array[0] as? String, "aoo")
|
||||
XCTAssertEqual(array[2] as? NSNull, NSNull())
|
||||
}
|
||||
|
||||
func testArrayAllDictionary() {
|
||||
var json: JSON = [["1": 1, "2": 2], ["a": "A", "b": "B"], ["null": NSNull()]]
|
||||
XCTAssertEqual(json.count, 3)
|
||||
|
||||
var index = 0
|
||||
var array = [AnyObject]()
|
||||
for (i, sub) in json {
|
||||
XCTAssertEqual(sub, json[index])
|
||||
XCTAssertEqual(i, "\(index)")
|
||||
array.append(sub.object as AnyObject)
|
||||
index += 1
|
||||
}
|
||||
XCTAssertEqual(index, 3)
|
||||
XCTAssertEqual((array[0] as! [String: Int])["1"]!, 1)
|
||||
XCTAssertEqual((array[0] as! [String: Int])["2"]!, 2)
|
||||
XCTAssertEqual((array[1] as! [String: String])["a"]!, "A")
|
||||
XCTAssertEqual((array[1] as! [String: String])["b"]!, "B")
|
||||
XCTAssertEqual((array[2] as! [String: NSNull])["null"]!, NSNull())
|
||||
}
|
||||
|
||||
func testDictionaryAllNumber() {
|
||||
var json: JSON = ["double": 1.11111, "int": 987654321]
|
||||
XCTAssertEqual(json.count, 2)
|
||||
|
||||
var index = 0
|
||||
var dictionary = [String: NSNumber]()
|
||||
for (key, sub) in json {
|
||||
XCTAssertEqual(sub, json[key])
|
||||
dictionary[key] = sub.number!
|
||||
index += 1
|
||||
}
|
||||
|
||||
XCTAssertEqual(index, 2)
|
||||
XCTAssertEqual(dictionary["double"]! as NSNumber, 1.11111)
|
||||
XCTAssertEqual(dictionary["int"]! as NSNumber, 987654321)
|
||||
}
|
||||
|
||||
func testDictionaryAllBool() {
|
||||
var json: JSON = ["t": true, "f": false, "false": false, "tr": true, "true": true]
|
||||
XCTAssertEqual(json.count, 5)
|
||||
|
||||
var index = 0
|
||||
var dictionary = [String: Bool]()
|
||||
for (key, sub) in json {
|
||||
XCTAssertEqual(sub, json[key])
|
||||
dictionary[key] = sub.bool!
|
||||
index += 1
|
||||
}
|
||||
|
||||
XCTAssertEqual(index, 5)
|
||||
XCTAssertEqual(dictionary["t"]! as Bool, true)
|
||||
XCTAssertEqual(dictionary["false"]! as Bool, false)
|
||||
}
|
||||
|
||||
func testDictionaryAllString() {
|
||||
var json: JSON = JSON(rawValue: ["a": "aoo", "bb": "bpp", "z": "zoo"] as NSDictionary)!
|
||||
XCTAssertEqual(json.count, 3)
|
||||
|
||||
var index = 0
|
||||
var dictionary = [String: String]()
|
||||
for (key, sub) in json {
|
||||
XCTAssertEqual(sub, json[key])
|
||||
dictionary[key] = sub.string!
|
||||
index += 1
|
||||
}
|
||||
|
||||
XCTAssertEqual(index, 3)
|
||||
XCTAssertEqual(dictionary["a"]! as String, "aoo")
|
||||
XCTAssertEqual(dictionary["bb"]! as String, "bpp")
|
||||
}
|
||||
|
||||
func testDictionaryWithNull() {
|
||||
var json: JSON = JSON(rawValue: ["a": "aoo", "bb": "bpp", "null": NSNull(), "z": "zoo"] as NSDictionary)!
|
||||
XCTAssertEqual(json.count, 4)
|
||||
|
||||
var index = 0
|
||||
var dictionary = [String: AnyObject]()
|
||||
for (key, sub) in json {
|
||||
XCTAssertEqual(sub, json[key])
|
||||
dictionary[key] = sub.object as AnyObject?
|
||||
index += 1
|
||||
}
|
||||
|
||||
XCTAssertEqual(index, 4)
|
||||
XCTAssertEqual(dictionary["a"]! as? String, "aoo")
|
||||
XCTAssertEqual(dictionary["bb"]! as? String, "bpp")
|
||||
XCTAssertEqual(dictionary["null"]! as? NSNull, NSNull())
|
||||
}
|
||||
|
||||
func testDictionaryAllArray() {
|
||||
var json: JSON = JSON (["Number": [NSNumber(value: 1), NSNumber(value: 2.123456), NSNumber(value: 123456789)], "String": ["aa", "bbb", "cccc"], "Mix": [true, "766", NSNull(), 655231.9823]])
|
||||
|
||||
XCTAssertEqual(json.count, 3)
|
||||
|
||||
var index = 0
|
||||
var dictionary = [String: AnyObject]()
|
||||
for (key, sub) in json {
|
||||
XCTAssertEqual(sub, json[key])
|
||||
dictionary[key] = sub.object as AnyObject?
|
||||
index += 1
|
||||
}
|
||||
|
||||
XCTAssertEqual(index, 3)
|
||||
XCTAssertEqual((dictionary["Number"] as! NSArray)[0] as? Int, 1)
|
||||
XCTAssertEqual((dictionary["Number"] as! NSArray)[1] as? Double, 2.123456)
|
||||
XCTAssertEqual((dictionary["String"] as! NSArray)[0] as? String, "aa")
|
||||
XCTAssertEqual((dictionary["Mix"] as! NSArray)[0] as? Bool, true)
|
||||
XCTAssertEqual((dictionary["Mix"] as! NSArray)[1] as? String, "766")
|
||||
XCTAssertEqual((dictionary["Mix"] as! NSArray)[2] as? NSNull, NSNull())
|
||||
XCTAssertEqual((dictionary["Mix"] as! NSArray)[3] as? Double, 655231.9823)
|
||||
}
|
||||
|
||||
func testDictionaryIteratingPerformance() {
|
||||
var json: JSON = [:]
|
||||
for i in 1...1000 {
|
||||
json[String(i)] = "hello"
|
||||
}
|
||||
measure {
|
||||
for (key, value) in json {
|
||||
print(key, value)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
// StringTests.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 StringTests: XCTestCase {
|
||||
|
||||
func testString() {
|
||||
//getter
|
||||
var json = JSON("abcdefg hijklmn;opqrst.?+_()")
|
||||
XCTAssertEqual(json.string!, "abcdefg hijklmn;opqrst.?+_()")
|
||||
XCTAssertEqual(json.stringValue, "abcdefg hijklmn;opqrst.?+_()")
|
||||
|
||||
json.string = "12345?67890.@#"
|
||||
XCTAssertEqual(json.string!, "12345?67890.@#")
|
||||
XCTAssertEqual(json.stringValue, "12345?67890.@#")
|
||||
}
|
||||
|
||||
func testUrl() {
|
||||
let json = JSON("http://github.com")
|
||||
XCTAssertEqual(json.url!, URL(string: "http://github.com")!)
|
||||
}
|
||||
|
||||
func testBool() {
|
||||
let json = JSON("true")
|
||||
XCTAssertTrue(json.boolValue)
|
||||
}
|
||||
|
||||
func testBoolWithY() {
|
||||
let json = JSON("Y")
|
||||
XCTAssertTrue(json.boolValue)
|
||||
}
|
||||
|
||||
func testBoolWithT() {
|
||||
let json = JSON("T")
|
||||
XCTAssertTrue(json.boolValue)
|
||||
}
|
||||
|
||||
func testBoolWithYes() {
|
||||
let json = JSON("Yes")
|
||||
XCTAssertTrue(json.boolValue)
|
||||
}
|
||||
|
||||
func testBoolWith1() {
|
||||
let json = JSON("1")
|
||||
XCTAssertTrue(json.boolValue)
|
||||
}
|
||||
|
||||
func testUrlPercentEscapes() {
|
||||
let emDash = "\\u2014"
|
||||
let urlString = "http://examble.com/unencoded" + emDash + "string"
|
||||
guard let encodedURLString = urlString.addingPercentEncoding(withAllowedCharacters: CharacterSet.urlQueryAllowed) else {
|
||||
return XCTFail("Couldn't encode URL string \(urlString)")
|
||||
}
|
||||
let json = JSON(urlString)
|
||||
XCTAssertEqual(json.url!, URL(string: encodedURLString)!, "Wrong unpacked ")
|
||||
let preEscaped = JSON(encodedURLString)
|
||||
XCTAssertEqual(preEscaped.url!, URL(string: encodedURLString)!, "Wrong unpacked ")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,267 @@
|
||||
// SubscriptTests.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 SubscriptTests: XCTestCase {
|
||||
|
||||
func testArrayAllNumber() {
|
||||
var json: JSON = [1, 2.0, 3.3, 123456789, 987654321.123456789]
|
||||
XCTAssertTrue(json == [1, 2.0, 3.3, 123456789, 987654321.123456789])
|
||||
XCTAssertTrue(json[0] == 1)
|
||||
XCTAssertEqual(json[1].double!, 2.0)
|
||||
XCTAssertTrue(json[2].floatValue == 3.3)
|
||||
XCTAssertEqual(json[3].int!, 123456789)
|
||||
XCTAssertEqual(json[4].doubleValue, 987654321.123456789)
|
||||
|
||||
json[0] = 1.9
|
||||
json[1] = 2.899
|
||||
json[2] = 3.567
|
||||
json[3] = 0.999
|
||||
json[4] = 98732
|
||||
|
||||
XCTAssertTrue(json[0] == 1.9)
|
||||
XCTAssertEqual(json[1].doubleValue, 2.899)
|
||||
XCTAssertTrue(json[2] == 3.567)
|
||||
XCTAssertTrue(json[3].float! == 0.999)
|
||||
XCTAssertTrue(json[4].intValue == 98732)
|
||||
}
|
||||
|
||||
func testArrayAllBool() {
|
||||
var json: JSON = [true, false, false, true, true]
|
||||
XCTAssertTrue(json == [true, false, false, true, true])
|
||||
XCTAssertTrue(json[0] == true)
|
||||
XCTAssertTrue(json[1] == false)
|
||||
XCTAssertTrue(json[2] == false)
|
||||
XCTAssertTrue(json[3] == true)
|
||||
XCTAssertTrue(json[4] == true)
|
||||
|
||||
json[0] = false
|
||||
json[4] = true
|
||||
XCTAssertTrue(json[0] == false)
|
||||
XCTAssertTrue(json[4] == true)
|
||||
}
|
||||
|
||||
func testArrayAllString() {
|
||||
var json: JSON = JSON(rawValue: ["aoo", "bpp", "zoo"] as NSArray)!
|
||||
XCTAssertTrue(json == ["aoo", "bpp", "zoo"])
|
||||
XCTAssertTrue(json[0] == "aoo")
|
||||
XCTAssertTrue(json[1] == "bpp")
|
||||
XCTAssertTrue(json[2] == "zoo")
|
||||
|
||||
json[1] = "update"
|
||||
XCTAssertTrue(json[0] == "aoo")
|
||||
XCTAssertTrue(json[1] == "update")
|
||||
XCTAssertTrue(json[2] == "zoo")
|
||||
}
|
||||
|
||||
func testArrayWithNull() {
|
||||
var json: JSON = JSON(rawValue: ["aoo", "bpp", NSNull(), "zoo"] as NSArray)!
|
||||
XCTAssertTrue(json[0] == "aoo")
|
||||
XCTAssertTrue(json[1] == "bpp")
|
||||
XCTAssertNil(json[2].string)
|
||||
XCTAssertNotNil(json[2].null)
|
||||
XCTAssertTrue(json[3] == "zoo")
|
||||
|
||||
json[2] = "update"
|
||||
json[3] = JSON(NSNull())
|
||||
XCTAssertTrue(json[0] == "aoo")
|
||||
XCTAssertTrue(json[1] == "bpp")
|
||||
XCTAssertTrue(json[2] == "update")
|
||||
XCTAssertNil(json[3].string)
|
||||
XCTAssertNotNil(json[3].null)
|
||||
}
|
||||
|
||||
func testArrayAllDictionary() {
|
||||
var json: JSON = [["1": 1, "2": 2], ["a": "A", "b": "B"], ["null": NSNull()]]
|
||||
XCTAssertTrue(json[0] == ["1": 1, "2": 2])
|
||||
XCTAssertEqual(json[1].dictionary!, ["a": "A", "b": "B"])
|
||||
XCTAssertEqual(json[2], JSON(["null": NSNull()]))
|
||||
XCTAssertTrue(json[0]["1"] == 1)
|
||||
XCTAssertTrue(json[0]["2"] == 2)
|
||||
XCTAssertEqual(json[1]["a"], JSON(rawValue: "A")!)
|
||||
XCTAssertEqual(json[1]["b"], JSON("B"))
|
||||
XCTAssertNotNil(json[2]["null"].null)
|
||||
XCTAssertNotNil(json[2, "null"].null)
|
||||
let keys: [JSONSubscriptType] = [1, "a"]
|
||||
XCTAssertEqual(json[keys], JSON(rawValue: "A")!)
|
||||
}
|
||||
|
||||
func testDictionaryAllNumber() {
|
||||
var json: JSON = ["double": 1.11111, "int": 987654321]
|
||||
XCTAssertEqual(json["double"].double!, 1.11111)
|
||||
XCTAssertTrue(json["int"] == 987654321)
|
||||
|
||||
json["double"] = 2.2222
|
||||
json["int"] = 123456789
|
||||
json["add"] = 7890
|
||||
XCTAssertTrue(json["double"] == 2.2222)
|
||||
XCTAssertEqual(json["int"].doubleValue, 123456789.0)
|
||||
XCTAssertEqual(json["add"].intValue, 7890)
|
||||
}
|
||||
|
||||
func testDictionaryAllBool() {
|
||||
var json: JSON = ["t": true, "f": false, "false": false, "tr": true, "true": true, "yes": true, "1": true]
|
||||
XCTAssertTrue(json["1"] == true)
|
||||
XCTAssertTrue(json["yes"] == true)
|
||||
XCTAssertTrue(json["t"] == true)
|
||||
XCTAssertTrue(json["f"] == false)
|
||||
XCTAssertTrue(json["false"] == false)
|
||||
XCTAssertTrue(json["tr"] == true)
|
||||
XCTAssertTrue(json["true"] == true)
|
||||
|
||||
json["f"] = true
|
||||
json["tr"] = false
|
||||
XCTAssertTrue(json["f"] == true)
|
||||
XCTAssertTrue(json["tr"] == JSON(false))
|
||||
}
|
||||
|
||||
func testDictionaryAllString() {
|
||||
var json: JSON = JSON(rawValue: ["a": "aoo", "bb": "bpp", "z": "zoo"] as NSDictionary)!
|
||||
XCTAssertTrue(json["a"] == "aoo")
|
||||
XCTAssertEqual(json["bb"], JSON("bpp"))
|
||||
XCTAssertTrue(json["z"] == "zoo")
|
||||
|
||||
json["bb"] = "update"
|
||||
XCTAssertTrue(json["a"] == "aoo")
|
||||
XCTAssertTrue(json["bb"] == "update")
|
||||
XCTAssertTrue(json["z"] == "zoo")
|
||||
}
|
||||
|
||||
func testDictionaryWithNull() {
|
||||
var json: JSON = JSON(rawValue: ["a": "aoo", "bb": "bpp", "null": NSNull(), "z": "zoo"] as NSDictionary)!
|
||||
XCTAssertTrue(json["a"] == "aoo")
|
||||
XCTAssertEqual(json["bb"], JSON("bpp"))
|
||||
XCTAssertEqual(json["null"], JSON(NSNull()))
|
||||
XCTAssertTrue(json["z"] == "zoo")
|
||||
|
||||
json["null"] = "update"
|
||||
XCTAssertTrue(json["a"] == "aoo")
|
||||
XCTAssertTrue(json["null"] == "update")
|
||||
XCTAssertTrue(json["z"] == "zoo")
|
||||
}
|
||||
|
||||
func testDictionaryAllArray() {
|
||||
//Swift bug: [1, 2.01,3.09] is convert to [1, 2, 3] (Array<Int>)
|
||||
let json: JSON = JSON ([[NSNumber(value: 1), NSNumber(value: 2.123456), NSNumber(value: 123456789)], ["aa", "bbb", "cccc"], [true, "766", NSNull(), 655231.9823]] as NSArray)
|
||||
XCTAssertTrue(json[0] == [1, 2.123456, 123456789])
|
||||
XCTAssertEqual(json[0][1].double!, 2.123456)
|
||||
XCTAssertTrue(json[0][2] == 123456789)
|
||||
XCTAssertTrue(json[1][0] == "aa")
|
||||
XCTAssertTrue(json[1] == ["aa", "bbb", "cccc"])
|
||||
XCTAssertTrue(json[2][0] == true)
|
||||
XCTAssertTrue(json[2][1] == "766")
|
||||
XCTAssertTrue(json[[2, 1]] == "766")
|
||||
XCTAssertEqual(json[2][2], JSON(NSNull()))
|
||||
XCTAssertEqual(json[2, 2], JSON(NSNull()))
|
||||
XCTAssertEqual(json[2][3], JSON(655231.9823))
|
||||
XCTAssertEqual(json[2, 3], JSON(655231.9823))
|
||||
XCTAssertEqual(json[[2, 3]], JSON(655231.9823))
|
||||
}
|
||||
|
||||
func testOutOfBounds() {
|
||||
let json: JSON = JSON ([[NSNumber(value: 1), NSNumber(value: 2.123456), NSNumber(value: 123456789)], ["aa", "bbb", "cccc"], [true, "766", NSNull(), 655231.9823]] as NSArray)
|
||||
XCTAssertEqual(json[9], JSON.null)
|
||||
XCTAssertEqual(json[-2].error, SwiftyJSONError.indexOutOfBounds)
|
||||
XCTAssertEqual(json[6].error, SwiftyJSONError.indexOutOfBounds)
|
||||
XCTAssertEqual(json[9][8], JSON.null)
|
||||
XCTAssertEqual(json[8][7].error, SwiftyJSONError.indexOutOfBounds)
|
||||
XCTAssertEqual(json[8, 7].error, SwiftyJSONError.indexOutOfBounds)
|
||||
XCTAssertEqual(json[999].error, SwiftyJSONError.indexOutOfBounds)
|
||||
}
|
||||
|
||||
func testErrorWrongType() {
|
||||
let json = JSON(12345)
|
||||
XCTAssertEqual(json[9], JSON.null)
|
||||
XCTAssertEqual(json[9].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json[8][7].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json["name"], JSON.null)
|
||||
XCTAssertEqual(json["name"].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json[0]["name"].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json["type"]["name"].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json["name"][99].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json[1, "Value"].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json[1, 2, "Value"].error, SwiftyJSONError.wrongType)
|
||||
XCTAssertEqual(json[[1, 2, "Value"]].error, SwiftyJSONError.wrongType)
|
||||
}
|
||||
|
||||
func testErrorNotExist() {
|
||||
let json: JSON = ["name": "NAME", "age": 15]
|
||||
XCTAssertEqual(json["Type"], JSON.null)
|
||||
XCTAssertEqual(json["Type"].error, SwiftyJSONError.notExist)
|
||||
XCTAssertEqual(json["Type"][1].error, SwiftyJSONError.notExist)
|
||||
XCTAssertEqual(json["Type", 1].error, SwiftyJSONError.notExist)
|
||||
XCTAssertEqual(json["Type"]["Value"].error, SwiftyJSONError.notExist)
|
||||
XCTAssertEqual(json["Type", "Value"].error, SwiftyJSONError.notExist)
|
||||
}
|
||||
|
||||
func testMultilevelGetter() {
|
||||
let json: JSON = [[[[["one": 1]]]]]
|
||||
XCTAssertEqual(json[[0, 0, 0, 0, "one"]].int!, 1)
|
||||
XCTAssertEqual(json[0, 0, 0, 0, "one"].int!, 1)
|
||||
XCTAssertEqual(json[0][0][0][0]["one"].int!, 1)
|
||||
}
|
||||
|
||||
func testMultilevelSetter1() {
|
||||
var json: JSON = [[[[["num": 1]]]]]
|
||||
json[0, 0, 0, 0, "num"] = 2
|
||||
XCTAssertEqual(json[[0, 0, 0, 0, "num"]].intValue, 2)
|
||||
json[0, 0, 0, 0, "num"] = JSON.null
|
||||
XCTAssertEqual(json[0, 0, 0, 0, "num"].null!, NSNull())
|
||||
json[0, 0, 0, 0, "num"] = 100.009
|
||||
XCTAssertEqual(json[0][0][0][0]["num"].doubleValue, 100.009)
|
||||
json[[0, 0, 0, 0]] = ["name": "Jack"]
|
||||
XCTAssertEqual(json[0, 0, 0, 0, "name"].stringValue, "Jack")
|
||||
XCTAssertEqual(json[0][0][0][0]["name"].stringValue, "Jack")
|
||||
XCTAssertEqual(json[[0, 0, 0, 0, "name"]].stringValue, "Jack")
|
||||
json[[0, 0, 0, 0, "name"]].string = "Mike"
|
||||
XCTAssertEqual(json[0, 0, 0, 0, "name"].stringValue, "Mike")
|
||||
let path: [JSONSubscriptType] = [0, 0, 0, 0, "name"]
|
||||
json[path].string = "Jim"
|
||||
XCTAssertEqual(json[path].stringValue, "Jim")
|
||||
}
|
||||
|
||||
func testMultilevelSetter2() {
|
||||
var json: JSON = ["user": ["id": 987654, "info": ["name": "jack", "email": "jack@gmail.com"], "feeds": [98833, 23443, 213239, 23232]]]
|
||||
json["user", "info", "name"] = "jim"
|
||||
XCTAssertEqual(json["user", "id"], 987654)
|
||||
XCTAssertEqual(json["user", "info", "name"], "jim")
|
||||
XCTAssertEqual(json["user", "info", "email"], "jack@gmail.com")
|
||||
XCTAssertEqual(json["user", "feeds"], [98833, 23443, 213239, 23232])
|
||||
json["user", "info", "email"] = "jim@hotmail.com"
|
||||
XCTAssertEqual(json["user", "id"], 987654)
|
||||
XCTAssertEqual(json["user", "info", "name"], "jim")
|
||||
XCTAssertEqual(json["user", "info", "email"], "jim@hotmail.com")
|
||||
XCTAssertEqual(json["user", "feeds"], [98833, 23443, 213239, 23232])
|
||||
json["user", "info"] = ["name": "tom", "email": "tom@qq.com"]
|
||||
XCTAssertEqual(json["user", "id"], 987654)
|
||||
XCTAssertEqual(json["user", "info", "name"], "tom")
|
||||
XCTAssertEqual(json["user", "info", "email"], "tom@qq.com")
|
||||
XCTAssertEqual(json["user", "feeds"], [98833, 23443, 213239, 23232])
|
||||
json["user", "feeds"] = [77323, 2313, 4545, 323]
|
||||
XCTAssertEqual(json["user", "id"], 987654)
|
||||
XCTAssertEqual(json["user", "info", "name"], "tom")
|
||||
XCTAssertEqual(json["user", "info", "email"], "tom@qq.com")
|
||||
XCTAssertEqual(json["user", "feeds"], [77323, 2313, 4545, 323])
|
||||
}
|
||||
}
|
||||
+345
@@ -0,0 +1,345 @@
|
||||
[
|
||||
{
|
||||
"coordinates":null,
|
||||
"truncated":false,
|
||||
"created_at":"Tue Aug 28 21:16:23 +0000 2012",
|
||||
"favorited":false,
|
||||
"id_str":"240558470661799936",
|
||||
"in_reply_to_user_id_str":null,
|
||||
"entities":{
|
||||
"urls":[
|
||||
|
||||
],
|
||||
"hashtags":[
|
||||
|
||||
],
|
||||
"user_mentions":[
|
||||
|
||||
]
|
||||
},
|
||||
"text":"just another test",
|
||||
"contributors":null,
|
||||
"id":240558470661799936,
|
||||
"retweet_count":0,
|
||||
"in_reply_to_status_id_str":null,
|
||||
"geo":null,
|
||||
"retweeted":false,
|
||||
"in_reply_to_user_id":null,
|
||||
"place":null,
|
||||
"source":"<a href=\"//realitytechnicians.com\" rel=\"\"nofollow\"\">OAuth Dancer Reborn</a>",
|
||||
"user":{
|
||||
"name":"OAuth Dancer",
|
||||
"profile_sidebar_fill_color":"DDEEF6",
|
||||
"profile_background_tile":true,
|
||||
"profile_sidebar_border_color":"C0DEED",
|
||||
"profile_image_url":"http://a0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg",
|
||||
"created_at":"Wed Mar 03 19:37:35 +0000 2010",
|
||||
"location":"San Francisco, CA",
|
||||
"follow_request_sent":false,
|
||||
"id_str":"119476949",
|
||||
"is_translator":false,
|
||||
"profile_link_color":"0084B4",
|
||||
"entities":{
|
||||
"url":{
|
||||
"urls":[
|
||||
{
|
||||
"expanded_url":null,
|
||||
"url":"http://bit.ly/oauth-dancer",
|
||||
"indices":[
|
||||
0,
|
||||
26
|
||||
],
|
||||
"display_url":null
|
||||
}
|
||||
]
|
||||
},
|
||||
"description":null
|
||||
},
|
||||
"default_profile":false,
|
||||
"url":"http://bit.ly/oauth-dancer",
|
||||
"contributors_enabled":false,
|
||||
"favourites_count":7,
|
||||
"utc_offset":null,
|
||||
"profile_image_url_https":"https://si0.twimg.com/profile_images/730275945/oauth-dancer_normal.jpg",
|
||||
"id":119476949,
|
||||
"listed_count":1,
|
||||
"profile_use_background_image":true,
|
||||
"profile_text_color":"333333",
|
||||
"followers_count":28,
|
||||
"lang":"en",
|
||||
"protected":false,
|
||||
"geo_enabled":true,
|
||||
"notifications":false,
|
||||
"description":"",
|
||||
"profile_background_color":"C0DEED",
|
||||
"verified":false,
|
||||
"time_zone":null,
|
||||
"profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/80151733/oauth-dance.png",
|
||||
"statuses_count":166,
|
||||
"profile_background_image_url":"http://a0.twimg.com/profile_background_images/80151733/oauth-dance.png",
|
||||
"default_profile_image":false,
|
||||
"friends_count":14,
|
||||
"following":false,
|
||||
"show_all_inline_media":false,
|
||||
"screen_name":"oauth_dancer"
|
||||
},
|
||||
"in_reply_to_screen_name":null,
|
||||
"in_reply_to_status_id":null
|
||||
},
|
||||
{
|
||||
"coordinates":{
|
||||
"coordinates":[
|
||||
-122.25831,
|
||||
37.871609
|
||||
],
|
||||
"type":"Point"
|
||||
},
|
||||
"truncated":false,
|
||||
"created_at":"Tue Aug 28 21:08:15 +0000 2012",
|
||||
"favorited":false,
|
||||
"id_str":"240556426106372096",
|
||||
"in_reply_to_user_id_str":null,
|
||||
"entities":{
|
||||
"urls":[
|
||||
{
|
||||
"expanded_url":"http://blogs.ischool.berkeley.edu/i290-abdt-s12/",
|
||||
"url":"http://t.co/bfj7zkDJ",
|
||||
"indices":[
|
||||
79,
|
||||
99
|
||||
],
|
||||
"display_url":"blogs.ischool.berkeley.edu/i290-abdt-s12/"
|
||||
}
|
||||
],
|
||||
"hashtags":[
|
||||
|
||||
],
|
||||
"user_mentions":[
|
||||
{
|
||||
"name":"Cal",
|
||||
"id_str":"17445752",
|
||||
"id":17445752,
|
||||
"indices":[
|
||||
60,
|
||||
64
|
||||
],
|
||||
"screen_name":"Cal"
|
||||
},
|
||||
{
|
||||
"name":"Othman Laraki",
|
||||
"id_str":"20495814",
|
||||
"id":20495814,
|
||||
"indices":[
|
||||
70,
|
||||
77
|
||||
],
|
||||
"screen_name":"othman"
|
||||
}
|
||||
]
|
||||
},
|
||||
"text":"lecturing at the \"analyzing big data with twitter\" class at @cal with @othman http://t.co/bfj7zkDJ",
|
||||
"contributors":null,
|
||||
"id":240556426106372096,
|
||||
"retweet_count":3,
|
||||
"in_reply_to_status_id_str":null,
|
||||
"geo":{
|
||||
"coordinates":[
|
||||
37.871609,
|
||||
-122.25831
|
||||
],
|
||||
"type":"Point"
|
||||
},
|
||||
"retweeted":false,
|
||||
"possibly_sensitive":false,
|
||||
"in_reply_to_user_id":null,
|
||||
"place":{
|
||||
"name":"Berkeley",
|
||||
"country_code":"US",
|
||||
"country":"United States",
|
||||
"attributes":{
|
||||
|
||||
},
|
||||
"url":"http://api.twitter.com/1/geo/id/5ef5b7f391e30aff.json",
|
||||
"id":"5ef5b7f391e30aff",
|
||||
"bounding_box":{
|
||||
"coordinates":[
|
||||
[
|
||||
[
|
||||
-122.367781,
|
||||
37.835727
|
||||
],
|
||||
[
|
||||
-122.234185,
|
||||
37.835727
|
||||
],
|
||||
[
|
||||
-122.234185,
|
||||
37.905824
|
||||
],
|
||||
[
|
||||
-122.367781,
|
||||
37.905824
|
||||
]
|
||||
]
|
||||
],
|
||||
"type":"Polygon"
|
||||
},
|
||||
"full_name":"Berkeley, CA",
|
||||
"place_type":"city"
|
||||
},
|
||||
"source":"<a href=\"//www.apple.com\"\" rel=\"\"nofollow\"\">Safari on iOS</a>",
|
||||
"user":{
|
||||
"name":"Raffi Krikorian",
|
||||
"profile_sidebar_fill_color":"DDEEF6",
|
||||
"profile_background_tile":false,
|
||||
"profile_sidebar_border_color":"C0DEED",
|
||||
"profile_image_url":"http://a0.twimg.com/profile_images/1270234259/raffi-headshot-casual_normal.png",
|
||||
"created_at":"Sun Aug 19 14:24:06 +0000 2007",
|
||||
"location":"San Francisco, California",
|
||||
"follow_request_sent":false,
|
||||
"id_str":"8285392",
|
||||
"is_translator":false,
|
||||
"profile_link_color":"0084B4",
|
||||
"entities":{
|
||||
"url":{
|
||||
"urls":[
|
||||
{
|
||||
"expanded_url":"http://about.me/raffi.krikorian",
|
||||
"url":"http://t.co/eNmnM6q",
|
||||
"indices":[
|
||||
0,
|
||||
19
|
||||
],
|
||||
"display_url":"about.me/raffi.krikorian"
|
||||
}
|
||||
]
|
||||
},
|
||||
"description":{
|
||||
"urls":[
|
||||
|
||||
]
|
||||
}
|
||||
},
|
||||
"default_profile":true,
|
||||
"url":"http://t.co/eNmnM6q",
|
||||
"contributors_enabled":false,
|
||||
"favourites_count":724,
|
||||
"utc_offset":-28800,
|
||||
"profile_image_url_https":"https://si0.twimg.com/profile_images/1270234259/raffi-headshot-casual_normal.png",
|
||||
"id":8285392,
|
||||
"listed_count":619,
|
||||
"profile_use_background_image":true,
|
||||
"profile_text_color":"333333",
|
||||
"followers_count":18752,
|
||||
"lang":"en",
|
||||
"protected":false,
|
||||
"geo_enabled":true,
|
||||
"notifications":false,
|
||||
"description":"Director of @twittereng's Platform Services. I break things.",
|
||||
"profile_background_color":"C0DEED",
|
||||
"verified":false,
|
||||
"time_zone":"Pacific Time (US & Canada)",
|
||||
"profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png",
|
||||
"statuses_count":5007,
|
||||
"profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png",
|
||||
"default_profile_image":false,
|
||||
"friends_count":701,
|
||||
"following":true,
|
||||
"show_all_inline_media":true,
|
||||
"screen_name":"raffi"
|
||||
},
|
||||
"in_reply_to_screen_name":null,
|
||||
"in_reply_to_status_id":null
|
||||
},
|
||||
{
|
||||
"coordinates":null,
|
||||
"truncated":false,
|
||||
"created_at":"Tue Aug 28 19:59:34 +0000 2012",
|
||||
"favorited":false,
|
||||
"id_str":"240539141056638977",
|
||||
"in_reply_to_user_id_str":null,
|
||||
"entities":{
|
||||
"urls":[
|
||||
|
||||
],
|
||||
"hashtags":[
|
||||
|
||||
],
|
||||
"user_mentions":[
|
||||
|
||||
]
|
||||
},
|
||||
"text":"You'd be right more often if you thought you were wrong.",
|
||||
"contributors":null,
|
||||
"id":240539141056638977,
|
||||
"retweet_count":1,
|
||||
"in_reply_to_status_id_str":null,
|
||||
"geo":null,
|
||||
"retweeted":false,
|
||||
"in_reply_to_user_id":null,
|
||||
"place":null,
|
||||
"source":"web",
|
||||
"user":{
|
||||
"name":"Taylor Singletary",
|
||||
"profile_sidebar_fill_color":"FBFBFB",
|
||||
"profile_background_tile":true,
|
||||
"profile_sidebar_border_color":"000000",
|
||||
"profile_image_url":"http://a0.twimg.com/profile_images/2546730059/f6a8zq58mg1hn0ha8vie_normal.jpeg",
|
||||
"created_at":"Wed Mar 07 22:23:19 +0000 2007",
|
||||
"location":"San Francisco, CA",
|
||||
"follow_request_sent":false,
|
||||
"id_str":"819797",
|
||||
"is_translator":false,
|
||||
"profile_link_color":"c71818",
|
||||
"entities":{
|
||||
"url":{
|
||||
"urls":[
|
||||
{
|
||||
"expanded_url":"http://www.rebelmouse.com/episod/",
|
||||
"url":"http://t.co/Lxw7upbN",
|
||||
"indices":[
|
||||
0,
|
||||
20
|
||||
],
|
||||
"display_url":"rebelmouse.com/episod/"
|
||||
}
|
||||
]
|
||||
},
|
||||
"description":{
|
||||
"urls":[
|
||||
|
||||
]
|
||||
}
|
||||
},
|
||||
"default_profile":false,
|
||||
"url":"http://t.co/Lxw7upbN",
|
||||
"contributors_enabled":false,
|
||||
"favourites_count":15990,
|
||||
"utc_offset":-28800,
|
||||
"profile_image_url_https":"https://si0.twimg.com/profile_images/2546730059/f6a8zq58mg1hn0ha8vie_normal.jpeg",
|
||||
"id":819797,
|
||||
"listed_count":340,
|
||||
"profile_use_background_image":true,
|
||||
"profile_text_color":"D20909",
|
||||
"followers_count":7126,
|
||||
"lang":"en",
|
||||
"protected":false,
|
||||
"geo_enabled":true,
|
||||
"notifications":false,
|
||||
"description":"Reality Technician, Twitter API team, synthesizer enthusiast; a most excellent adventure in timelines. I know it's hard to believe in something you can't see.",
|
||||
"profile_background_color":"000000",
|
||||
"verified":false,
|
||||
"time_zone":"Pacific Time (US & Canada)",
|
||||
"profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/643655842/hzfv12wini4q60zzrthg.png",
|
||||
"statuses_count":18076,
|
||||
"profile_background_image_url":"http://a0.twimg.com/profile_background_images/643655842/hzfv12wini4q60zzrthg.png",
|
||||
"default_profile_image":false,
|
||||
"friends_count":5444,
|
||||
"following":true,
|
||||
"show_all_inline_media":true,
|
||||
"screen_name":"episod"
|
||||
},
|
||||
"in_reply_to_screen_name":null,
|
||||
"in_reply_to_status_id":null
|
||||
}
|
||||
]
|
||||
@@ -17,9 +17,9 @@
|
||||
<key>CFBundlePackageType</key>
|
||||
<string>APPL</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>1.3.5</string>
|
||||
<string>1.3.6</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>15</string>
|
||||
<string>16</string>
|
||||
<key>LSApplicationCategoryType</key>
|
||||
<string>public.app-category.utilities</string>
|
||||
<key>LSMinimumSystemVersion</key>
|
||||
|
||||
Reference in New Issue
Block a user