19 Commits
Author SHA1 Message Date
acheronfail f6f8ea731c version: 1.4.0 2019-08-31 10:01:35 +10:00
acheronfail 5f2ece38fc chore: add HJKL keybindings to the README 2019-08-31 09:59:54 +10:00
acheronfail 4cad2a9db3 Merge pull request #24 from adrianniebla/pixel_navigation
Added vim style navigation to pixel picker.
2019-08-31 09:56:29 +10:00
Adrian Samuel Niebla Rios e4fe3e9d43 Added vim style navigation to pixel picker. 2019-08-30 16:31:29 -05:00
acheronfail 8c0a82c2f0 version: 1.3.6 2019-05-29 14:29:58 +10:00
acheronfail 124c1cc145 chore: carthage update --platform macos 2019-05-29 14:29:39 +10:00
acheronfail 02b4beacb3 version: 1.3.5 2019-05-29 14:25:36 +10:00
acheronfail 8495bcde33 Merge pull request #22 from viktorstrate/fix-grid-offset
Move crosshair and grid by 0.5 pixels
2019-05-29 14:23:53 +10:00
viktorstrate 32d8f24286 Move crosshair and grid by 0.5 pixels
To perfectly align it between the pixels
2019-05-28 15:47:46 +02:00
acheronfail f843510abe version: 1.3.4 2019-03-04 10:42:15 +11:00
acheronfail 1e4d9f1f07 fix: swift uicolor formatters were producing nscolor strings
fixes #20
2019-03-04 10:30:35 +11:00
acheronfail 54af9202ab version: 1.3.3 2019-02-21 22:22:31 +11:00
acheronfail d9d0aa8211 fix: issues with development signing 2019-02-20 12:35:43 +11:00
acheronfail 5ebfac1d01 version: 1.3.2 2019-02-20 07:21:14 +11:00
acheronfail 6e400d191f chore: rename from "PixelPicker" to "Pixel Picker" 2019-02-20 07:21:03 +11:00
acheronfail 5ad66714fc chore: update README.md 2019-02-19 14:18:50 +11:00
acheronfail 061f29c887 version: 1.3.1 2019-02-19 09:49:26 +11:00
acheronfail dde01f357d chore: carthage update and codesign application 2019-02-19 09:43:09 +11:00
acheronfail b445e0517f chore: use an entirely legit method to call some pointers 2019-02-19 09:01:16 +11:00
105 changed files with 4919 additions and 260 deletions
+2 -2
View File
@@ -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.4.0"
github "sindresorhus/LaunchAtLogin" "v2.5.0"
+1 -1
View File
@@ -1,6 +1,6 @@
Pod::Spec.new do |s|
s.name = 'LaunchAtLogin'
s.version = '2.4.0'
s.version = '2.5.0'
s.summary = 'Add "Launch at Login" functionality to your sandboxed macOS app in seconds'
s.license = 'MIT'
s.homepage = 'https://github.com/sindresorhus/LaunchAtLogin'
+1 -1
View File
@@ -13,7 +13,7 @@
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>2.4.0</string>
<string>2.5.0</string>
<key>CFBundleVersion</key>
<string>$(CURRENT_PROJECT_VERSION)</string>
<key>NSHumanReadableCopyright</key>
@@ -9,7 +9,12 @@ mkdir -p "$helper_dir"
cp -rf "$origin_helper_path" "$helper_dir/"
defaults write "$helper_path/Contents/Info" CFBundleIdentifier -string "$PRODUCT_BUNDLE_IDENTIFIER-LaunchAtLoginHelper"
codesign --force --entitlements="$CODE_SIGN_ENTITLEMENTS" --sign="$EXPANDED_CODE_SIGN_IDENTITY_NAME" "$helper_path"
if [[ -n $CODE_SIGN_ENTITLEMENTS ]]; then
codesign --force --entitlements="$CODE_SIGN_ENTITLEMENTS" --options=runtime --sign="$EXPANDED_CODE_SIGN_IDENTITY_NAME" "$helper_path"
else
codesign --force --options=runtime --sign="$EXPANDED_CODE_SIGN_IDENTITY_NAME" "$helper_path"
fi
if [[ $CONFIGURATION == "Release" ]]; then
rm -rf "$origin_helper_path"
+5 -5
View File
@@ -1,12 +1,12 @@
# LaunchAtLogin
> Add "Launch at Login" functionality to your sandboxed macOS app in seconds
> Add "Launch at Login" functionality to your macOS app in seconds
It's usually quite a [convoluted and error-prone process](before-after.md) to add this. **No more!**
It's App Store compatible and used in my [Lungo](https://blog.sindresorhus.com/lungo-b364a6c2745f) and [Battery Indicator](https://sindresorhus.com/battery-indicator) app.
This package works with both sandboxed and non-sandboxed apps and it's App Store compatible and used in my [Lungo](https://blog.sindresorhus.com/lungo-b364a6c2745f) and [Battery Indicator](https://sindresorhus.com/battery-indicator) apps.
You might also find my [`create-dmg`](https://github.com/sindresorhus/create-dmg) project useful.
*You might also find my [`create-dmg`](https://github.com/sindresorhus/create-dmg) project useful if you're publishing your app outside the App Store.*
## Requirements
@@ -42,13 +42,13 @@ Add a new ["Run Script Phase"](http://stackoverflow.com/a/39633955/64949) below
Carthage:
```sh
./Carthage/Build/Mac/LaunchAtLogin.framework/Resources/copy-helper.sh
"${PROJECT_DIR}/Carthage/Build/Mac/LaunchAtLogin.framework/Resources/copy-helper.sh"
```
CocoaPods:
```sh
./Pods/LaunchAtLogin/LaunchAtLogin/copy-helper.sh
"${PROJECT_DIR}/Pods/LaunchAtLogin/LaunchAtLogin/copy-helper.sh"
```
Use it in your app:
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -1,9 +1,15 @@
# SwiftyJSON
[![Travis CI](https://travis-ci.org/SwiftyJSON/SwiftyJSON.svg?branch=master)](https://travis-ci.org/SwiftyJSON/SwiftyJSON) [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) ![CocoaPods](https://img.shields.io/cocoapods/v/SwiftyJSON.svg) ![Platform](https://img.shields.io/badge/platforms-iOS%208.0+%20%7C%20macOS%2010.10+%20%7C%20tvOS%209.0+%20%7C%20watchOS%202.0+-333333.svg)
[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) ![CocoaPods](https://img.shields.io/cocoapods/v/SwiftyJSON.svg) ![Platform](https://img.shields.io/badge/platforms-iOS%208.0%20%7C%20macOS%2010.10%20%7C%20tvOS%209.0%20%7C%20watchOS%203.0-F28D00.svg) [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)
SwiftyJSON makes it easy to deal with JSON data in Swift.
Platform | Build Status
---------| --------------|
*OS | [![Travis CI](https://travis-ci.org/SwiftyJSON/SwiftyJSON.svg?branch=master)](https://travis-ci.org/SwiftyJSON/SwiftyJSON) |
[Linux](https://github.com/IBM-Swift/SwiftyJSON) | [![Build Status](https://travis-ci.org/IBM-Swift/SwiftyJSON.svg?branch=master)](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
View File
@@ -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;
};
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "0930"
LastUpgradeVersion = "1020"
version = "1.3">
<BuildAction
parallelizeBuildables = "YES"
+24
View File
@@ -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>
+24
View File
@@ -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>
+24
View File
@@ -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"])
}
}
@@ -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)
}
}
@@ -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
View File
@@ -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":"&lt;a href=\"//realitytechnicians.com\" rel=\"\"nofollow\"\"&gt;OAuth Dancer Reborn&lt;/a&gt;",
"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":"&lt;a href=\"//www.apple.com\"\" rel=\"\"nofollow\"\"&gt;Safari on iOS&lt;/a&gt;",
"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 &amp; 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 &amp; 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
}
]
@@ -37,6 +37,7 @@
BAA17B7A20B14CC100625455 /* MASShortcut.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BAA17B7220B14CC100625455 /* MASShortcut.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
BAA17B7C20B14CEB00625455 /* SwiftyJSON.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = BAA17B7B20B14CEB00625455 /* SwiftyJSON.framework */; };
BAA17B7D20B14CEB00625455 /* SwiftyJSON.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = BAA17B7B20B14CEB00625455 /* SwiftyJSON.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
BAB6F14F221ABB3500EA11D4 /* ShowAndHideCursor.swift in Sources */ = {isa = PBXBuildFile; fileRef = BAB6F14E221ABB3500EA11D4 /* ShowAndHideCursor.swift */; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
@@ -74,11 +75,11 @@
159F304D2079A111000BD387 /* AppDelegateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegateTests.swift; sourceTree = "<group>"; };
159F30512079A147000BD387 /* PPStateTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PPStateTests.swift; sourceTree = "<group>"; };
15A8D9712083624600D55A9B /* Helpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Helpers.swift; sourceTree = "<group>"; };
15B4E870207994AF0024FDE4 /* PixelPickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = PixelPickerTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
15B4E870207994AF0024FDE4 /* Pixel PickerTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Pixel PickerTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
15B4E874207994AF0024FDE4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
15FC8CC7204E2E2C000B5E1E /* PPState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PPState.swift; sourceTree = "<group>"; };
15FF0CCC204A231800E04103 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Bridging-Header.h"; path = "PixelPicker/Bridging-Header.h"; sourceTree = "<group>"; };
B3B4C2BD1E25894B009F8E4E /* PixelPicker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = PixelPicker.app; sourceTree = BUILT_PRODUCTS_DIR; };
15FF0CCC204A231800E04103 /* Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "Bridging-Header.h"; path = "Pixel Picker/Bridging-Header.h"; sourceTree = "<group>"; };
B3B4C2BD1E25894B009F8E4E /* Pixel Picker.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Pixel Picker.app"; sourceTree = BUILT_PRODUCTS_DIR; };
B3B4C2C01E25894B009F8E4E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
B3B4C2C21E25894B009F8E4E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
B3B4C2C71E25894B009F8E4E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
@@ -100,6 +101,7 @@
BAA17B7120B14CC000625455 /* CleanroomLogger.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CleanroomLogger.framework; path = Carthage/Build/Mac/CleanroomLogger.framework; sourceTree = "<group>"; };
BAA17B7220B14CC100625455 /* MASShortcut.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MASShortcut.framework; path = Carthage/Build/Mac/MASShortcut.framework; sourceTree = "<group>"; };
BAA17B7B20B14CEB00625455 /* SwiftyJSON.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SwiftyJSON.framework; path = Carthage/Build/Mac/SwiftyJSON.framework; sourceTree = "<group>"; };
BAB6F14E221ABB3500EA11D4 /* ShowAndHideCursor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ShowAndHideCursor.swift; sourceTree = "<group>"; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -137,7 +139,7 @@
path = OverlayPanel;
sourceTree = "<group>";
};
15B4E871207994AF0024FDE4 /* PixelPickerTests */ = {
15B4E871207994AF0024FDE4 /* Pixel PickerTests */ = {
isa = PBXGroup;
children = (
159F304D2079A111000BD387 /* AppDelegateTests.swift */,
@@ -145,7 +147,7 @@
15A8D9712083624600D55A9B /* Helpers.swift */,
15B4E874207994AF0024FDE4 /* Info.plist */,
);
path = PixelPickerTests;
path = "Pixel PickerTests";
sourceTree = "<group>";
};
B3B4C2B41E25894B009F8E4E = {
@@ -156,8 +158,8 @@
BAA17B6F20B14CC000625455 /* LaunchAtLogin.framework */,
BAA17B7220B14CC100625455 /* MASShortcut.framework */,
15FF0CCC204A231800E04103 /* Bridging-Header.h */,
B3B4C2BF1E25894B009F8E4E /* PixelPicker */,
15B4E871207994AF0024FDE4 /* PixelPickerTests */,
B3B4C2BF1E25894B009F8E4E /* Pixel Picker */,
15B4E871207994AF0024FDE4 /* Pixel PickerTests */,
B3B4C2BE1E25894B009F8E4E /* Products */,
BA22232520AFEC1B0001069C /* Frameworks */,
);
@@ -166,18 +168,19 @@
B3B4C2BE1E25894B009F8E4E /* Products */ = {
isa = PBXGroup;
children = (
B3B4C2BD1E25894B009F8E4E /* PixelPicker.app */,
15B4E870207994AF0024FDE4 /* PixelPickerTests.xctest */,
B3B4C2BD1E25894B009F8E4E /* Pixel Picker.app */,
15B4E870207994AF0024FDE4 /* Pixel PickerTests.xctest */,
);
name = Products;
sourceTree = "<group>";
};
B3B4C2BF1E25894B009F8E4E /* PixelPicker */ = {
B3B4C2BF1E25894B009F8E4E /* Pixel Picker */ = {
isa = PBXGroup;
children = (
15493F6620BE6E0F007B2BA5 /* CGImage.swift */,
BA74C13420A6F1BE00306B27 /* ShowAndHideCursor.h */,
BA74C13220A6F16C00306B27 /* ShowAndHideCursor.m */,
BAB6F14E221ABB3500EA11D4 /* ShowAndHideCursor.swift */,
BA71817320AE2DCC00619700 /* PPMenuShortcutView.h */,
BA71817120AE2DB400619700 /* PPMenuShortcutView.m */,
B3B4C2C01E25894B009F8E4E /* AppDelegate.swift */,
@@ -193,7 +196,7 @@
155D2C02204F61220087478B /* Credits.rtfd */,
B3B4C2C71E25894B009F8E4E /* Info.plist */,
);
path = PixelPicker;
path = "Pixel Picker";
sourceTree = "<group>";
};
BA22232520AFEC1B0001069C /* Frameworks */ = {
@@ -207,9 +210,9 @@
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
15B4E86F207994AF0024FDE4 /* PixelPickerTests */ = {
15B4E86F207994AF0024FDE4 /* Pixel PickerTests */ = {
isa = PBXNativeTarget;
buildConfigurationList = 15B4E877207994AF0024FDE4 /* Build configuration list for PBXNativeTarget "PixelPickerTests" */;
buildConfigurationList = 15B4E877207994AF0024FDE4 /* Build configuration list for PBXNativeTarget "Pixel PickerTests" */;
buildPhases = (
15B4E86C207994AF0024FDE4 /* Sources */,
15B4E86D207994AF0024FDE4 /* Frameworks */,
@@ -220,14 +223,14 @@
dependencies = (
15B4E876207994AF0024FDE4 /* PBXTargetDependency */,
);
name = PixelPickerTests;
name = "Pixel PickerTests";
productName = PixelPickerTests;
productReference = 15B4E870207994AF0024FDE4 /* PixelPickerTests.xctest */;
productReference = 15B4E870207994AF0024FDE4 /* Pixel PickerTests.xctest */;
productType = "com.apple.product-type.bundle.unit-test";
};
B3B4C2BC1E25894B009F8E4E /* PixelPicker */ = {
B3B4C2BC1E25894B009F8E4E /* Pixel Picker */ = {
isa = PBXNativeTarget;
buildConfigurationList = B3B4C2CA1E25894B009F8E4E /* Build configuration list for PBXNativeTarget "PixelPicker" */;
buildConfigurationList = B3B4C2CA1E25894B009F8E4E /* Build configuration list for PBXNativeTarget "Pixel Picker" */;
buildPhases = (
B3B4C2B91E25894B009F8E4E /* Sources */,
B3B4C2BA1E25894B009F8E4E /* Frameworks */,
@@ -239,9 +242,9 @@
);
dependencies = (
);
name = PixelPicker;
name = "Pixel Picker";
productName = PixelPicker;
productReference = B3B4C2BD1E25894B009F8E4E /* PixelPicker.app */;
productReference = B3B4C2BD1E25894B009F8E4E /* Pixel Picker.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
@@ -267,11 +270,12 @@
};
};
};
buildConfigurationList = B3B4C2B81E25894B009F8E4E /* Build configuration list for PBXProject "PixelPicker" */;
buildConfigurationList = B3B4C2B81E25894B009F8E4E /* Build configuration list for PBXProject "Pixel Picker" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
English,
en,
Base,
);
@@ -280,8 +284,8 @@
projectDirPath = "";
projectRoot = "";
targets = (
B3B4C2BC1E25894B009F8E4E /* PixelPicker */,
15B4E86F207994AF0024FDE4 /* PixelPickerTests */,
B3B4C2BC1E25894B009F8E4E /* Pixel Picker */,
15B4E86F207994AF0024FDE4 /* Pixel PickerTests */,
);
};
/* End PBXProject section */
@@ -319,7 +323,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "./Carthage/Build/Mac/LaunchAtLogin.framework/Resources/copy-helper.sh";
shellScript = "\"${PROJECT_DIR}/Carthage/Build/Mac/LaunchAtLogin.framework/Resources/copy-helper.sh\"\n";
};
/* End PBXShellScriptBuildPhase section */
@@ -348,6 +352,7 @@
BA74C13120A6E95900306B27 /* PPOverlayPanel.swift in Sources */,
BA74C14020AA390400306B27 /* PPOverlayPreview.swift in Sources */,
BA74C14420AA609500306B27 /* PPOverlayWrapper.swift in Sources */,
BAB6F14F221ABB3500EA11D4 /* ShowAndHideCursor.swift in Sources */,
BA74C0F820A692D100306B27 /* PPOverlayController.swift in Sources */,
15493F6720BE6E0F007B2BA5 /* CGImage.swift in Sources */,
BA74C14220AA409D00306B27 /* NSColor.swift in Sources */,
@@ -360,7 +365,7 @@
/* Begin PBXTargetDependency section */
15B4E876207994AF0024FDE4 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = B3B4C2BC1E25894B009F8E4E /* PixelPicker */;
target = B3B4C2BC1E25894B009F8E4E /* Pixel Picker */;
targetProxy = 15B4E875207994AF0024FDE4 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
@@ -383,14 +388,15 @@
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = PixelPickerTests/Info.plist;
INFOPLIST_FILE = "Pixel PickerTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.13;
PRODUCT_BUNDLE_IDENTIFIER = com.acheronfail.PixelPickerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Pixel Picker/Bridging-Header.h";
SWIFT_VERSION = 4.2;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PixelPicker.app/Contents/MacOS/PixelPicker";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Pixel Picker.app/Contents/MacOS/Pixel Picker";
};
name = Debug;
};
@@ -411,14 +417,15 @@
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
GCC_C_LANGUAGE_STANDARD = gnu11;
INFOPLIST_FILE = PixelPickerTests/Info.plist;
INFOPLIST_FILE = "Pixel PickerTests/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.13;
PRODUCT_BUNDLE_IDENTIFIER = com.acheronfail.PixelPickerTests;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "Pixel Picker/Bridging-Header.h";
SWIFT_VERSION = 4.2;
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/PixelPicker.app/Contents/MacOS/PixelPicker";
TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Pixel Picker.app/Contents/MacOS/Pixel Picker";
};
name = Release;
};
@@ -552,13 +559,14 @@
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
GCC_C_LANGUAGE_STANDARD = c11;
INFOPLIST_FILE = PixelPicker/Info.plist;
INFOPLIST_FILE = "Pixel Picker/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = "com.acheronfail.pixel-picker";
PRODUCT_MODULE_NAME = PixelPicker;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "PixelPicker/Bridging-Header.h";
SWIFT_OBJC_BRIDGING_HEADER = "Pixel Picker/Bridging-Header.h";
SWIFT_VERSION = 4.2;
};
name = Debug;
@@ -577,13 +585,14 @@
"$(PROJECT_DIR)/Carthage/Build/Mac",
);
GCC_C_LANGUAGE_STANDARD = c11;
INFOPLIST_FILE = PixelPicker/Info.plist;
INFOPLIST_FILE = "Pixel Picker/Info.plist";
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks";
MACOSX_DEPLOYMENT_TARGET = 10.12;
PRODUCT_BUNDLE_IDENTIFIER = "com.acheronfail.pixel-picker";
PRODUCT_MODULE_NAME = PixelPicker;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SWIFT_OBJC_BRIDGING_HEADER = "PixelPicker/Bridging-Header.h";
SWIFT_OBJC_BRIDGING_HEADER = "Pixel Picker/Bridging-Header.h";
SWIFT_VERSION = 4.2;
};
name = Release;
@@ -591,7 +600,7 @@
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
15B4E877207994AF0024FDE4 /* Build configuration list for PBXNativeTarget "PixelPickerTests" */ = {
15B4E877207994AF0024FDE4 /* Build configuration list for PBXNativeTarget "Pixel PickerTests" */ = {
isa = XCConfigurationList;
buildConfigurations = (
15B4E878207994AF0024FDE4 /* Debug */,
@@ -600,7 +609,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B3B4C2B81E25894B009F8E4E /* Build configuration list for PBXProject "PixelPicker" */ = {
B3B4C2B81E25894B009F8E4E /* Build configuration list for PBXProject "Pixel Picker" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B3B4C2C81E25894B009F8E4E /* Debug */,
@@ -609,7 +618,7 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
B3B4C2CA1E25894B009F8E4E /* Build configuration list for PBXNativeTarget "PixelPicker" */ = {
B3B4C2CA1E25894B009F8E4E /* Build configuration list for PBXNativeTarget "Pixel Picker" */ = {
isa = XCConfigurationList;
buildConfigurations = (
B3B4C2CB1E25894B009F8E4E /* Debug */,
@@ -2,6 +2,6 @@
<Workspace
version = "1.0">
<FileRef
location = "self:/Users/cosmotherly/dev/pixel-picker/PixelPicker.xcodeproj">
location = "self:/Users/cosmotherly/src/pixel-picker/Pixel Picker.xcodeproj">
</FileRef>
</Workspace>
@@ -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>
@@ -15,9 +15,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B3B4C2BC1E25894B009F8E4E"
BuildableName = "PixelPicker.app"
BlueprintName = "PixelPicker"
ReferencedContainer = "container:PixelPicker.xcodeproj">
BuildableName = "Pixel Picker.app"
BlueprintName = "Pixel Picker"
ReferencedContainer = "container:Pixel Picker.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
@@ -34,9 +34,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "15B4E86F207994AF0024FDE4"
BuildableName = "PixelPickerTests.xctest"
BlueprintName = "PixelPickerTests"
ReferencedContainer = "container:PixelPicker.xcodeproj">
BuildableName = "Pixel PickerTests.xctest"
BlueprintName = "Pixel PickerTests"
ReferencedContainer = "container:Pixel Picker.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
@@ -44,9 +44,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B3B4C2BC1E25894B009F8E4E"
BuildableName = "PixelPicker.app"
BlueprintName = "PixelPicker"
ReferencedContainer = "container:PixelPicker.xcodeproj">
BuildableName = "Pixel Picker.app"
BlueprintName = "Pixel Picker"
ReferencedContainer = "container:Pixel Picker.xcodeproj">
</BuildableReference>
</MacroExpansion>
<EnvironmentVariables>
@@ -79,9 +79,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B3B4C2BC1E25894B009F8E4E"
BuildableName = "PixelPicker.app"
BlueprintName = "PixelPicker"
ReferencedContainer = "container:PixelPicker.xcodeproj">
BuildableName = "Pixel Picker.app"
BlueprintName = "Pixel Picker"
ReferencedContainer = "container:Pixel Picker.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
<AdditionalOptions>
@@ -98,9 +98,9 @@
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "B3B4C2BC1E25894B009F8E4E"
BuildableName = "PixelPicker.app"
BlueprintName = "PixelPicker"
ReferencedContainer = "container:PixelPicker.xcodeproj">
BuildableName = "Pixel Picker.app"
BlueprintName = "Pixel Picker"
ReferencedContainer = "container:Pixel Picker.xcodeproj">
</BuildableReference>
</BuildableProductRunnable>
</ProfileAction>
@@ -1,6 +1,6 @@
//
// AppDelegate+Menu.swift
// PixelPicker
// Pixel Picker
//
/**
@@ -1,6 +1,6 @@
//
// AppDelegate.swift
// PixelPicker
// Pixel Picker
//
import MASShortcut
@@ -24,9 +24,11 @@ import CleanroomLogger
var logConfigurations: [LogConfiguration] = [
RotatingLogFileConfiguration(minimumSeverity: minimumSeverity, daysToKeep: 7, directoryPath: defaultLogPath().path)
]
#if DEBUG
logConfigurations.append(XcodeLogConfiguration(minimumSeverity: .debug))
#endif
Log.enable(configuration: logConfigurations)
PPState.shared.loadFromDisk()
}

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 994 B

After

Width:  |  Height:  |  Size: 994 B

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 15 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

Before

Width:  |  Height:  |  Size: 3.4 KiB

After

Width:  |  Height:  |  Size: 3.4 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 38 KiB

After

Width:  |  Height:  |  Size: 38 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

@@ -1,6 +1,6 @@
//
// Bridging-Header.h
// PixelPicker
// Pixel Picker
//
#ifndef Bridging_Header_h
@@ -1,6 +1,6 @@
//
// CGImage.swift
// PixelPicker
// Pixel Picker
//
import CleanroomLogger
@@ -1,9 +1,9 @@
{\rtf1\ansi\ansicpg1252\cocoartf1561\cocoasubrtf400
{\fonttbl\f0\fswiss\fcharset0 ArialMT;\f1\fnil\fcharset0 AppleColorEmoji;\f2\fmodern\fcharset0 Courier;
}
{\rtf1\ansi\ansicpg1252\cocoartf1671\cocoasubrtf200
{\fonttbl\f0\fswiss\fcharset0 ArialMT;\f1\fnil\fcharset0 AppleColorEmoji;\f2\fswiss\fcharset0 Arial-BoldMT;
\f3\fswiss\fcharset0 Arial-ItalicMT;\f4\fmodern\fcharset0 Courier;}
{\colortbl;\red255\green255\blue255;\red0\green0\blue0;\red230\green230\blue230;}
{\*\expandedcolortbl;;\cssrgb\c0\c0\c0;\csgray\c92143;}
\margl1440\margr1440\vieww12800\viewh10340\viewkind0
\paperw12240\paperh15840\margl1440\margr1440\vieww12800\viewh10340\viewkind0
\deftab720
\pard\pardeftab720\qc\partightenfactor0
@@ -16,8 +16,8 @@
\f0 \
\
\b\fs28 PixelPicker makes use of the following open source libraries
\b0\fs26\fsmilli13333 \
\f2\b\fs28 Pixel Picker makes use of the following open source libraries
\f0\b0\fs26\fsmilli13333 \
\pard\pardeftab720\qc\partightenfactor0
{\field{\*\fldinst{HYPERLINK "https://github.com/emaloney/CleanroomLogger"}}{\fldrslt \cf2 CleanroomLogger}}\
\pard\pardeftab720\qc\partightenfactor0
@@ -29,36 +29,36 @@
\
\pard\pardeftab720\qc\partightenfactor0
\b\fs36 \cf2 Experimental Overrides
\b0 \
\f2\b\fs36 \cf2 Experimental Overrides
\f0\b0 \
\pard\pardeftab720\qc\partightenfactor0
\fs26\fsmilli13333 \cf2 These are experimental options that haven't made it into PixelPickers's UI yet, and may be toggled via the Terminal. Each override is listed as
\b key:
\i\b0 type
\i0 which you can enable like:\
\fs26\fsmilli13333 \cf2 These are experimental options that haven't made it into Pixel Pickers's UI yet, and may be toggled via the Terminal. Each override is listed as
\f2\b key:
\f3\i\b0 type
\f0\i0 which you can enable like:\
\pard\pardeftab720\qc\partightenfactor0
\f2\fs20 \cf2 \cb3 defaults write com.acheronfail.pixel-picker debugMode -bool true
\f4\fs20 \cf2 \cb3 defaults write com.acheronfail.pixel-picker debugMode -bool true
\f0\fs26\fsmilli13333 \cb1 \
\
\pard\pardeftab720\qc\partightenfactor0
\b \cf0 \kerning1\expnd0\expndtw0 leftClickActivates
\b0 \cf2 \expnd0\expndtw0\kerning0
\f2\b \cf0 \kerning1\expnd0\expndtw0 leftClickActivates
\f0\b0 \cf2 \expnd0\expndtw0\kerning0
:
\i \cf0 \kerning1\expnd0\expndtw0 Bool = false\
\f3\i \cf0 \kerning1\expnd0\expndtw0 Bool = false\
\pard\pardeftab720\qc\partightenfactor0
\i0 \cf2 \expnd0\expndtw0\kerning0
\f0\i0 \cf2 \expnd0\expndtw0\kerning0
Swaps the left and right click buttons when clicking on the menu bar icon. So left-clicking will activate the picker, and right-clicking will open the dropdown menu.\
\
\pard\pardeftab720\qc\partightenfactor0
\b \cf0 \kerning1\expnd0\expndtw0 debugMode
\b0 \cf2 \expnd0\expndtw0\kerning0
\f2\b \cf0 \kerning1\expnd0\expndtw0 debugMode
\f0\b0 \cf2 \expnd0\expndtw0\kerning0
:
\i \cf0 \kerning1\expnd0\expndtw0 Bool = false
\i0 \cf2 \expnd0\expndtw0\kerning0
\f3\i \cf0 \kerning1\expnd0\expndtw0 Bool = false
\f0\i0 \cf2 \expnd0\expndtw0\kerning0
\
Set this to true to enable debug logging. This results in a higher level of logs being written to ~/Library/Preferences/PixelPicker/logs/.}
Set this to true to enable debug logging. This results in a higher level of logs being written to ~/Library/Preferences/Pixel Picker/logs/.}
@@ -17,9 +17,9 @@
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>1.3.0</string>
<string>1.4.0</string>
<key>CFBundleVersion</key>
<string>10</string>
<string>17</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
@@ -1,6 +1,6 @@
//
// NSBezierPath.swift
// PixelPicker
// Pixel Picker
//
// Extend NSBezierPath to allow easy conversion to a CGPath.
@@ -1,6 +1,6 @@
//
// NSColor.swift
// PixelPicker
// Pixel Picker
//
import SwiftyJSON
@@ -1,6 +1,6 @@
//
// PPOverlayController.swift
// PixelPicker
// Pixel Picker
//
import CleanroomLogger
@@ -110,11 +110,41 @@ class PPOverlayController: NSWindowController {
case kVK_RightArrow:
PPState.shared.chosenFormat = PPState.shared.chosenFormat.next()
updateInfoPanel(lastHighlightedColor, lastHighlightedColor.bestContrastingColor())
case kVK_ANSI_K:
moveByPixel(dx: 0.0, dy: 1.0)
// Move up
break
case kVK_ANSI_J:
moveByPixel(dx: 0.0, dy: -1.0)
// Move down
break
case kVK_ANSI_H:
moveByPixel(dx: -1.0, dy: 0.0)
// Move left
break
case kVK_ANSI_L:
moveByPixel(dx: 1.0, dy: 0.0)
// Move right
break
default:
break
}
}
func moveByPixel(dx: CGFloat, dy: CGFloat) {
var mouseLoc = lastMouseLocation
let currentScreen = getScreenWithMouse()
guard let screenFrame = currentScreen?.frame, let screenScale = currentScreen?.backingScaleFactor else {
return
}
mouseLoc.x += dx / screenScale
mouseLoc.y += dy / screenScale
lastMouseLocation = mouseLoc
updatePreview(aroundPoint: mouseLoc)
mouseLoc.y = screenFrame.maxY - mouseLoc.y
CGDisplayMoveCursorToPoint(0, mouseLoc)
}
// Enable "focusMode" when correct modifier flag is changed.
override func flagsChanged(with event: NSEvent) {
if isEnabled {
@@ -228,6 +258,15 @@ class PPOverlayController: NSWindowController {
infoPanel.setFrame(rect, display: false)
}
// Get the screen that current has displayed the mouse.
func getScreenWithMouse() -> NSScreen? {
let mouseLocation = NSEvent.mouseLocation
let screens = NSScreen.screens
let screenWithMouse = (screens.first { NSMouseInRect(mouseLocation, $0.frame, false) })
return screenWithMouse
}
// Updates the info panel with the correct colors and text.
func updateInfoPanel(_ color: NSColor, _ contrastingColor: NSColor) {
infoWrapper.layer?.backgroundColor = color.cgColor
@@ -1,6 +1,6 @@
//
// PPOverlayPanel.swift
// PixelPicker
// Pixel Picker
//
// This class is in charge of managing the panels which are brought to the front
@@ -1,6 +1,6 @@
//
// PPOverlayPreview.swift
// PixelPicker
// Pixel Picker
//
// This class is in charge of rendering the pixel preview.
@@ -37,7 +37,7 @@ class PPOverlayPreview: NSView, CALayerDelegate {
// Update the crosshair with the correct color, position and size.
func updateCrosshair(_ pixelSize: CGFloat, _ middle: CGFloat, _ color: CGColor) {
let pos: CGFloat = (pixelSize * middle) - (pixelSize / 2)
let pos: CGFloat = (pixelSize * middle) - (pixelSize / 2) + 0.5
let pixelRect = NSMakeRect(pos, pos, pixelSize, pixelSize)
crosshair.path = CGPath(rect: pixelRect, transform: nil)
@@ -58,11 +58,11 @@ class PPOverlayPreview: NSView, CALayerDelegate {
lastNumberOfCells = n
let path = NSBezierPath()
let start = CGFloat(0)
let end = CGFloat(n) * size
let start = CGFloat(0) + 0.5
let end = CGFloat(n) * size + 0.5
for i in 1..<n {
let pos = CGFloat(i) * size
let pos = CGFloat(i) * size + 0.5
path.move(to: NSPoint(x: pos, y: start))
path.line(to: NSPoint(x: pos, y: end))
path.move(to: NSPoint(x: start, y: pos))
@@ -1,6 +1,6 @@
//
// PPOverlayWrapper.swift
// PixelPicker
// Pixel Picker
//
// This class is basically the content view of the overlay panel.
@@ -1,6 +1,6 @@
//
// PPColor.swift
// PixelPicker
// Pixel Picker
//
import SwiftyJSON
@@ -94,8 +94,8 @@ enum PPColor: String, CaseIterable {
case .swiftNSColorCalibratedRgb: return self.formatAsDecimal(c, f("NSColor(calibratedRed: %f, green: %f, blue: %f, alpha: 1.000)"), .rgb)
case .swiftNSColorDeviceHsb: return self.formatAsDecimal(c, f("NSColor(deviceHue: %f, saturation: %f, brightness: %f, alpha: 1.000)"), .hsb)
case .swiftNSColorCalibratedHsb: return self.formatAsDecimal(c, f("NSColor(calibratedHue: %f, saturation: %f, brightness: %f, alpha: 1.000)"), .hsb)
case .swiftUIColorRgb: return self.formatAsDecimal(c, f("NSColor(red: %f, green: %f, blue: %f, alpha: 1.000)"), .rgb)
case .swiftUIColorHsb: return self.formatAsDecimal(c, f("NSColor(hue: %f, saturation: %f, brightness: %f, alpha: 1.000)"), .hsb)
case .swiftUIColorRgb: return self.formatAsDecimal(c, f("UIColor(red: %f, green: %f, blue: %f, alpha: 1.000)"), .rgb)
case .swiftUIColorHsb: return self.formatAsDecimal(c, f("UIColor(hue: %f, saturation: %f, brightness: %f, alpha: 1.000)"), .hsb)
case .objCNSColorRgb: return self.formatAsDecimal(c, f("[NSColor colorWithSRGBRed: %f green: %f blue: %f alpha:1.000]"), .rgb)
case .objCNSColorDeviceRgb: return self.formatAsDecimal(c, f("[NSColor colorWithDeviceRed: %f green: %f blue: %f alpha:1.000]"), .rgb)
case .objCNSColorCalibratedRgb: return self.formatAsDecimal(c, f("[NSColor colorWithCalibratedRed: %f green: %f blue: %f alpha:1.000]"), .rgb)
@@ -1,6 +1,6 @@
//
// CarbonEventInterceptor.h
// PixelPicker
// Pixel Picker
//
#ifndef CarbonEventInterceptor_h
@@ -1,6 +1,6 @@
//
// CarbonEventInterceptor.m
// PixelPicker
// Pixel Picker
//
#import "PPMenuShortcutView.h"
@@ -1,6 +1,6 @@
//
// PPState.swift
// PixelPicker
// Pixel Picker
//
import SwiftyJSON
+14
View File
@@ -0,0 +1,14 @@
//
// ShowAndHideCursor.h
// Pixel Picker
//
#ifndef ShowAndHideCursor_h
#define ShowAndHideCursor_h
#import <Foundation/Foundation.h>
// Unfortunately `kCGDirectMainDisplay` is unavailable in Swift.
CGDirectDisplayID kCGDirectMainDisplayGetter(void);
#endif /* ShowAndHideCursor_h */
+11
View File
@@ -0,0 +1,11 @@
//
// ShowAndHideCursor.m
// Pixel Picker
//
#include "ShowAndHideCursor.h"
// Unfortunately `kCGDirectMainDisplay` is unavailable in Swift.
CGDirectDisplayID kCGDirectMainDisplayGetter() {
return kCGDirectMainDisplay;
}
+86
View File
@@ -0,0 +1,86 @@
//
// ShowAndHideCursor.swift
// Pixel Picker
//
import Foundation
import ApplicationServices
typealias notAPrivateAPI0 = @convention(c) () -> CInt
typealias notAPrivateAPI1 = @convention(c) (CInt, CInt, CFString, CFTypeRef) -> CGError
// JS: f = (n, s) => `[${[...s].map((x, i) => x.charCodeAt(0) + i + n).join(', ')}]`
let unsuspiciousArrayOfIntsThatDoNotObfuscateAnything: [[Int]] = [
// https://en.wikipedia.org/wiki/Leet
[1, 3, 3, 7],
// Framework path
[84, 123, 118, 120, 106, 115, 54, 84, 114, 108, 125, 109, 127, 135, 62, 86, 131, 115, 128, 121, 140, 133, 137, 131, 140, 73, 92, 140, 141, 138, 136, 131, 130, 150, 140, 147, 147, 121, 140, 154, 159, 147, 142, 145, 160, 92, 149, 162, 146, 159, 152, 171, 164, 168, 162, 103, 122, 170, 171, 168, 166, 161, 160, 180, 170, 177, 177, 151, 170, 184, 189, 177, 172, 175, 190],
// _CGSDefaultConnection
[97, 70, 75, 88, 74, 108, 110, 106, 127, 119, 128, 80, 125, 125, 126, 118, 117, 135, 125, 132, 132],
// CGSSetConnectionProperty
[70, 75, 88, 89, 108, 124, 76, 121, 121, 122, 114, 113, 131, 121, 128, 128, 99, 134, 132, 134, 124, 138, 141, 147]
]
func aFnThatDoesNotObfuscateAnythingAtAll(_ i: Int, _ ints: [Int]) -> String {
return String(ints.enumerated().map({ Character(UnicodeScalar($0.element + i - $0.offset)!) }))
}
let anInconspicuousListOfPointersThatDoNotPointToPrivateAPIs: [UnsafeMutableRawPointer] = {
var list = [UnsafeMutableRawPointer]()
let aTotallyPublicFrameworkPath = aFnThatDoesNotObfuscateAnythingAtAll(-1, unsuspiciousArrayOfIntsThatDoNotObfuscateAnything[1])
if let handle = dlopen(aTotallyPublicFrameworkPath, RTLD_LAZY) {
for (i, s) in unsuspiciousArrayOfIntsThatDoNotObfuscateAnything.dropFirst(2).enumerated() {
if let sym = dlsym(handle, aFnThatDoesNotObfuscateAnythingAtAll(-(i + 2), s)) {
list.append(sym)
}
}
dlclose(handle)
}
return list
}()
// Unfortunately, this can't be accessed in Swift. *sigh*
let kCGDirectMainDisplay = kCGDirectMainDisplayGetter()
// Calls to `CGDisplayShowCursor` and `CGDisplayHideCursor` need to be balanced.
// See https://developer.apple.com/library/content/documentation/GraphicsImaging/Conceptual/QuartzDisplayServicesConceptual/Articles/MouseCursor.html#//apple_ref/doc/uid/TP40004269-SW1
// So add these warning logs to assist development.
var cursorIsHidden = false
// Decrements the hide cursor count, and shows the mouse cursor if the count is 0.
func ShowCursor() {
#if DEBUG
if (!cursorIsHidden) {
print("WARNING: Calls to ShowCursor/HideCursor must be balanced, inbalanced call detected")
}
cursorIsHidden = false
#endif
CGDisplayShowCursor(kCGDirectMainDisplay);
}
// Hides the mouse cursor, and increments the hide cursor count.
// Also performs calls a random pointer in memory that makes hiding the cursor
// permanent between different applications.
func HideCursor() {
#if DEBUG
if (cursorIsHidden) {
print("WARNING: Calls to ShowCursor/HideCursor must be balanced, inbalanced call detected")
}
cursorIsHidden = true
#endif
let pt0 = anInconspicuousListOfPointersThatDoNotPointToPrivateAPIs[0]
let cid = unsafeBitCast(pt0, to: notAPrivateAPI0.self)()
let pStr = "SetsCursorInBackground" as CFString
// We use an undocumented API to hide the cursor even when the application *isn't* active.
// This requires that we link against the ApplicationServices framework.
// See: https://stackoverflow.com/a/3939241/5552584
// Also: https://github.com/asmagill/hammerspoon_asm.undocumented/blob/master/cursor/CGSConnection.h
let pt1 = anInconspicuousListOfPointersThatDoNotPointToPrivateAPIs[1]
let _ = unsafeBitCast(pt1, to: notAPrivateAPI1.self)(cid, cid, pStr, kCFBooleanTrue)
CGDisplayHideCursor(kCGDirectMainDisplay)
}
@@ -1,6 +1,6 @@
//
// Util.swift
// PixelPicker
// Pixel Picker
//
import CleanroomLogger

Some files were not shown because too many files have changed in this diff Show More