├── .swift-version
├── Cartfile
├── Cartfile.resolved
├── Package.swift
├── .gitmodules
├── .swiftlint.yml
├── JSONMatcher.xcodeproj
├── project.xcworkspace
│ └── contents.xcworkspacedata
├── xcshareddata
│ └── xcschemes
│ │ ├── JSONMatcher-OSX.xcscheme
│ │ ├── JSONMatcher-tvOS.xcscheme
│ │ └── JSONMatcher-iOS.xcscheme
└── project.pbxproj
├── JSONMatcher.xcworkspace
└── contents.xcworkspacedata
├── Tests
└── JSONMatcher
│ ├── fixtures
│ └── snorlax.json
│ ├── BaseTestCase.swift
│ ├── RegexTests.swift
│ ├── Info.plist
│ ├── BeJSONTests.swift
│ ├── BeJSONIncludingTests.swift
│ ├── ExampleTests.swift
│ ├── ElementTests.swift
│ ├── BeJSONAsTests.swift
│ ├── BuilderTests.swift
│ └── ComparerTests.swift
├── Sources
└── JSONMatcher
│ ├── Matcher
│ ├── BeJSON.swift
│ ├── BeJSONAs.swift
│ └── BeJSONIncluding.swift
│ ├── JSONMatcher.h
│ ├── Regex.swift
│ ├── Type.swift
│ ├── Info.plist
│ ├── Extractor.swift
│ ├── Element.swift
│ ├── Builder.swift
│ └── Comparer.swift
├── .travis.yml
├── codecov.yml
├── run_tests
├── LICENSE.md
├── JSONMatcher.podspec
├── .gitignore
└── README.md
/.swift-version:
--------------------------------------------------------------------------------
1 | 3.0
2 |
--------------------------------------------------------------------------------
/Cartfile:
--------------------------------------------------------------------------------
1 | github "Quick/Nimble"
2 |
--------------------------------------------------------------------------------
/Cartfile.resolved:
--------------------------------------------------------------------------------
1 | github "Quick/Nimble" "v6.1.0"
2 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | import PackageDescription
2 |
3 | let package = Package(
4 | name: "JSONMatcher"
5 | )
6 |
--------------------------------------------------------------------------------
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "Carthage/Checkouts/Nimble"]
2 | path = Carthage/Checkouts/Nimble
3 | url = https://github.com/Quick/Nimble.git
4 |
--------------------------------------------------------------------------------
/.swiftlint.yml:
--------------------------------------------------------------------------------
1 | included:
2 | - Sources/JSONMatcher
3 | - Tests/JSONMatcher
4 | line_length: 120
5 | disabled_rules:
6 | - force_cast
7 | - force_try
8 | - function_body_length
9 | cyclomatic_complexity:
10 | warning: 20
11 |
--------------------------------------------------------------------------------
/JSONMatcher.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/JSONMatcher.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/fixtures/snorlax.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "Snorlax",
3 | "no": 143,
4 | "species": "Sleeping",
5 | "type": [
6 | "normal"
7 | ],
8 | "stats": {
9 | "hp": 160,
10 | "attack": 110,
11 | "defense": 65,
12 | "special_attack": 65,
13 | "special_defense": 65,
14 | "speed": 30
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Matcher/BeJSON.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Nimble
3 |
4 | public func beJSON() -> MatcherFunc {
5 | return MatcherFunc { actualExpression, failureMessage in
6 | failureMessage.postfixMessage = "be JSON"
7 | let extractor = Extractor()
8 | return extractor.isValid(try! actualExpression.evaluate())
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | env:
2 | global:
3 | - LC_CTYPE=en_US.UTF-8
4 | matrix:
5 | include:
6 | - os: osx
7 | language: objective-c
8 | osx_image: xcode8.3
9 | script:
10 | - pod lib lint --allow-warnings
11 | - swiftlint
12 | - ./run_tests ios
13 | - ./run_tests osx
14 | - ./run_tests tvos
15 | after_success:
16 | - bash <(curl -s https://codecov.io/bash) -J 'JSONMatcher'
17 |
--------------------------------------------------------------------------------
/codecov.yml:
--------------------------------------------------------------------------------
1 | codecov:
2 | notify:
3 | require_ci_to_pass: yes
4 |
5 | coverage:
6 | precision: 2
7 | round: down
8 | range: 70...100
9 |
10 | status:
11 | project: true
12 | patch: true
13 | changes: true
14 |
15 | comment:
16 | layout: "header, diff, changes, uncovered"
17 | behavior: default
18 | coverage:
19 | ignore:
20 | - Tests/JSONMatcher/*
21 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/JSONMatcher.h:
--------------------------------------------------------------------------------
1 | #import
2 |
3 | //! Project version number for JSONMatcher.
4 | FOUNDATION_EXPORT double JSONMatcherVersionNumber;
5 |
6 | //! Project version string for JSONMatcher.
7 | FOUNDATION_EXPORT const unsigned char JSONMatcherVersionString[];
8 |
9 | // In this header, you should import all the public headers of your framework using statements like #import
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/BaseTestCase.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import XCTest
3 |
4 | class BaseTestCase: XCTestCase {
5 | func loadJSONFile(_ jsonName: String) -> String {
6 | let bundle = Bundle(for: type(of: self))
7 | let path = bundle.path(forResource: jsonName, ofType: "json")!
8 | let jsonData = try? Data(contentsOf: URL(fileURLWithPath: path))
9 | return String(data: jsonData!, encoding: .utf8)!
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/RegexTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class RegexTestCase: XCTestCase {
6 | func testMatch() {
7 | expect(".+".regex.match("foobar")).to(beTrue())
8 | }
9 |
10 | func testRegex() {
11 | let regex = ".+".regex
12 | let expected = try! NSRegularExpression(pattern: ".+", options: [])
13 | expect(regex.pattern).to(equal(expected.pattern))
14 | expect(regex.options).to(equal(expected.options))
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Regex.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | public extension ExpressibleByStringLiteral {
4 | var regex: NSRegularExpression {
5 | return try! NSRegularExpression(pattern: self as! String, options: [])
6 | }
7 | }
8 |
9 | internal extension NSRegularExpression {
10 | func match(_ string: String) -> Bool {
11 | let range = NSRange(location: 0, length: string.characters.count)
12 | let matches = self.matches(in: string, options:[], range:range)
13 | return !matches.isEmpty
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Matcher/BeJSONAs.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Nimble
3 |
4 | public func beJSONAs(_ expected: Any) -> MatcherFunc {
5 | return MatcherFunc { actualExpression, failureMessage in
6 | let extractor = Extractor()
7 | let object = try! actualExpression.evaluate()
8 | let lhs = extractor.extract(object)
9 | let rhs = extractor.extract(expected)
10 | let comparer = Comparer()
11 | failureMessage.postfixMessage = "equal to <\(stringify(rhs))>"
12 | return comparer.compare(lhs, rhs)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Matcher/BeJSONIncluding.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Nimble
3 |
4 | public func beJSONIncluding(_ expected: Any) -> MatcherFunc {
5 | return MatcherFunc { actualExpression, failureMessage in
6 | let extractor = Extractor()
7 | let object = try! actualExpression.evaluate()
8 | let lhs = extractor.extract(object)
9 | let rhs = extractor.extract(expected)
10 | let comparer = Comparer()
11 | failureMessage.postfixMessage = "include <\(stringify(rhs))>"
12 | return comparer.include(lhs, rhs)
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/run_tests:
--------------------------------------------------------------------------------
1 | set -e -o pipefail
2 |
3 | function ios_tests {
4 | xcodebuild test -workspace JSONMatcher.xcworkspace -scheme JSONMatcher-iOS -destination 'platform=iOS Simulator,name=iPhone 6' | xcpretty -c
5 | }
6 |
7 | function osx_tests {
8 | xcodebuild test -workspace JSONMatcher.xcworkspace -scheme JSONMatcher-OSX -destination 'platform=OS X' | xcpretty -c
9 | }
10 |
11 | function tvos_tests {
12 | xcodebuild test -workspace JSONMatcher.xcworkspace -scheme JSONMatcher-tvOS -destination 'platform=tvOS Simulator,name=Apple TV 1080p' | xcpretty -c
13 | }
14 |
15 | for arg in "$@"
16 | do
17 | case $arg in
18 | "ios") ios_tests;;
19 | "osx") osx_tests;;
20 | "tvos") tvos_tests;;
21 | esac
22 | done
23 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Type.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | public class Type: Equatable {
4 | enum RawType {
5 | case number
6 | case string
7 | case boolean
8 | case array
9 | case dictionary
10 | case null
11 | case unknown
12 | }
13 |
14 | let rawType: RawType
15 |
16 | init(_ rawType: RawType) {
17 | self.rawType = rawType
18 | }
19 |
20 | public static let Number = Type(RawType.number)
21 | public static let String = Type(RawType.string)
22 | public static let Boolean = Type(RawType.boolean)
23 | public static let Array = Type(RawType.array)
24 | public static let Dictionary = Type(RawType.dictionary)
25 | public static let Null = Type(RawType.null)
26 | }
27 |
28 | public func == (lhs: Type, rhs: Type) -> Bool {
29 | return lhs.rawType == rhs.rawType
30 | }
31 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Extractor.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | struct Extractor {
4 | func extract(_ object: T) -> BaseElementType {
5 | let builder = Builder()
6 | if let jsonString = object as? String {
7 | let jsonObject = self.extractJSONString(jsonString)
8 | return builder.buildJSONElement(jsonObject)
9 | }
10 | return builder.buildJSONElement(object)
11 | }
12 |
13 | func isValid(_ object: T) -> Bool {
14 | if object is NSNull {
15 | return true
16 | }
17 | let element = self.extract(object)
18 | if element is NullElement {
19 | return false
20 | }
21 | return true
22 | }
23 |
24 | private func extractJSONString(_ jsonString: String) -> Any? {
25 | if let data = jsonString.data(using: .utf8) {
26 | return try? JSONSerialization.jsonObject(with: data, options: [])
27 | }
28 | return nil
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/BeJSONTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class BeJSONTestCase: BaseTestCase {
6 | func testBeJSONWithObject() {
7 | expect(10).to(beJSON())
8 | expect(10.1).to(beJSON())
9 | expect(["Buibasaur", "Charmander", "Squirtle"]).to(beJSON())
10 | expect(NSNull()).to(beJSON())
11 | expect(NSObject()).toNot(beJSON())
12 | }
13 |
14 | func testFailureMessages() {
15 | failsWithErrorMessage("expected to be JSON, got <{>") {
16 | expect("{").to(beJSON())
17 | }
18 | failsWithErrorMessage("expected to not be JSON, got <{}>") {
19 | expect("{}").toNot(beJSON())
20 | }
21 | }
22 |
23 | func testBeJSONWithJSONString() {
24 | expect("Pikachu").toNot(beJSON())
25 | expect("{}").to(beJSON())
26 | expect("{").toNot(beJSON())
27 |
28 | let json = loadJSONFile("snorlax")
29 | expect(json).to(beJSON())
30 |
31 | let pikachu = loadJSONFile("pikachu")
32 | expect(pikachu).to(beJSON())
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 giginet
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/JSONMatcher.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "JSONMatcher"
3 | s.version = "0.1.0"
4 | s.summary = "A JSON matcher extension for Nimble"
5 | s.description = <<-DESC
6 | JSONMatcher is a JSON matcher library for Swift testing. It works as an extension for Nimble.
7 | DESC
8 | s.homepage = "https://github.com/giginet/JSONMatcher"
9 | s.license = { :type => "MIT", :file => "LICENSE.md" }
10 | s.author = { "giginet" => "giginet.net@gmail.com" }
11 | s.social_media_url = "http://twitter.com/giginet"
12 | s.ios.deployment_target = "8.0"
13 | s.osx.deployment_target = "10.10"
14 | s.tvos.deployment_target = "9.0"
15 | s.source = { :git => "https://github.com/giginet/JSONMatcher.git", :tag => "v#{s.version}" }
16 | s.source_files = "Sources/JSONMatcher/**/*.{swift,h,m}"
17 | s.weak_framework = "XCTest"
18 | s.requires_arc = true
19 | s.dependency "Nimble", "~> 6.1.0"
20 | s.pod_target_xcconfig = { 'ENABLE_BITCODE' => 'NO', 'OTHER_LDFLAGS' => '-weak-lswiftXCTest', 'FRAMEWORK_SEARCH_PATHS' => '$(inherited) "$(PLATFORM_DIR)/Developer/Library/Frameworks"' }
21 | end
22 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/BeJSONIncludingTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class BeJSONIncludingTestCase: BaseTestCase {
6 | func testIncludingJSON() {
7 | expect(["name": "Pikachu", "no": 25]).to(beJSONIncluding(["name": "Pikachu"]))
8 | expect(["name": "Pikachu", "no": 25]).to(beJSONIncluding([:]))
9 | expect(["name": "Pikachu", "no": 25]).toNot(beJSONIncluding(["name": "Mew"]))
10 | }
11 |
12 | func testRecursiveDictionary() {
13 | let snorlax = loadJSONFile("snorlax")
14 | expect(snorlax).to(beJSONIncluding(["name": "Snorlax"]))
15 | expect(snorlax).to(beJSONIncluding(["hp": 160]))
16 | expect(snorlax).to(beJSONIncluding(["hp": 160, "attack": 110]))
17 | expect(snorlax).toNot(beJSONIncluding(["hp": 16, "attack": 110]))
18 | expect(snorlax).to(beJSONIncluding(["hp": 160, "defense": 65]))
19 | expect(snorlax).to(beJSONIncluding(["stats": ["hp": 160]]))
20 | }
21 |
22 | func testComplexJSON() {
23 | let pikachu = loadJSONFile("pikachu")
24 | expect(pikachu).to(beJSONIncluding(["name": "swift"]))
25 | expect(pikachu).to(beJSONIncluding(["name": "swift", "url": Type.String]))
26 | }
27 |
28 | func testFailureMessages() {
29 | failsWithErrorMessage("expected to include <[\"name\": \"Pikachu\"]>, got <[\"no\": 25, \"name\": \"Pikachu\"]>") {
30 | expect(["name": "Pikachu", "no": 25]).to(beJSONIncluding(["name": "Pikachu"]))
31 | }
32 | failsWithErrorMessage("expected to not include <[\"name\": \"Mew\"]>, got <[\"no\": 25, \"name\": \"Pikachu\"]>") {
33 | expect(["name": "Pikachu", "no": 25]).toNot(beJSONIncluding(["name": "Mew"]))
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/ExampleTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class ExampleTestCase: XCTestCase {
6 | func testSimpleExamples() {
7 | expect("{\"name\": \"Pikachu\"}").to(beJSON())
8 | expect(["name": "Pikachu", "no": 25]).to(beJSONIncluding(["name": "Pikachu"]))
9 | expect(["name": "Pikachu", "no": 25]).to(beJSONAs(["name": "Pikachu", "no": 25]))
10 | }
11 |
12 | func testComplexExample() {
13 | expect([
14 | "name": "Snorlax",
15 | "no": 143,
16 | "species": "Sleeping",
17 | "type": ["normal"],
18 | "stats": [
19 | "hp": 160,
20 | "attack": 110,
21 | "defense": 65,
22 | "special_attack": 65,
23 | "special_defense": 65,
24 | "speed": 30
25 | ],
26 | "moves": [
27 | ["name": "Tackle", "type": "normal", "level": 1],
28 | ["name": "Hyper Beam", "type": "normal", "level": NSNull()],
29 | ]
30 | ]).to(beJSONAs([
31 | "name": "Snorlax",
32 | "no": Type.Number, // value type matching
33 | "species": try! NSRegularExpression(pattern: "[A-Z][a-z]+", options: []), // regular expression matching
34 | "type": ["[a-z]+".regex], // shorthands for NSRegularExpression
35 | "stats": [
36 | "hp": 160,
37 | "attack": 110,
38 | "defense": 65,
39 | "special_attack": 65,
40 | "special_defense": 65,
41 | "speed": 30
42 | ],
43 | "moves": [
44 | ["name": "Tackle", "type": "[a-z]+".regex, "level": Type.Number], // nested collection
45 | ["name": "Hyper Beam", "type": "normal", "level": NSNull()],
46 | ]
47 | ]))
48 | }
49 | }
50 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/ElementTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class ElementTestCase: XCTestCase {
6 | func testNumberElement() {
7 | let number0 = NumberElement(10)
8 | let number1 = NumberElement(10.0)
9 | expect(number0.value).to(equal(number1.value))
10 | expect(number0.type).to(equal(Type.RawType.number))
11 | expect(number1.type).to(equal(Type.RawType.number))
12 | }
13 |
14 | func testStringElement() {
15 | let string0 = StringElement("sushi")
16 | let string1 = StringElement("🍣")
17 | expect(string0.value).toNot(equal(string1.value))
18 | expect(string0.type).to(equal(Type.RawType.string))
19 | expect(string1.type).to(equal(Type.RawType.string))
20 | }
21 |
22 | func testBooleanElement() {
23 | let bool0 = BooleanElement(true)
24 | let bool1 = BooleanElement(false)
25 | expect(bool0.value).toNot(equal(bool1.value))
26 | expect(bool0.type).to(equal(Type.RawType.boolean))
27 | expect(bool1.type).to(equal(Type.RawType.boolean))
28 | }
29 |
30 | func testNullElement() {
31 | let null0 = NullElement(NSNull())
32 | expect(null0.value).to(equal(NSNull()))
33 | expect(null0.type).to(equal(Type.RawType.null))
34 | }
35 |
36 | func testArrayElement() {
37 | let array0 = ArrayElement([
38 | NumberElement(10),
39 | NumberElement(10.5),
40 | StringElement("sushi"),
41 | BooleanElement(true),
42 | NullElement(NSNull())
43 | ])
44 | expect(array0.type).to(equal(Type.RawType.array))
45 | }
46 |
47 | func testDictionaryElement() {
48 | let dictionary0 = DictionaryElement([
49 | "int": NumberElement(10),
50 | "double": NumberElement(10.5),
51 | "sushi": StringElement("sushi"),
52 | "bool": BooleanElement(true),
53 | "null": NullElement(NSNull())
54 | ])
55 | expect(dictionary0.type).to(equal(Type.RawType.dictionary))
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Element.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | typealias ElementArray = [BaseElementType]
4 | typealias ElementDictionary = [String: BaseElementType]
5 |
6 | protocol BaseElementType { }
7 |
8 | protocol ElementType: BaseElementType, CustomStringConvertible {
9 | associatedtype T
10 | var value: T { get }
11 | var type: Type.RawType { get }
12 | }
13 |
14 | extension ElementType {
15 | var description: String {
16 | return String(describing: self.value)
17 | }
18 | }
19 |
20 | struct NumberElement: ElementType {
21 | let value: NSNumber
22 | let type: Type.RawType = .number
23 |
24 | init(_ number: NSNumber) {
25 | self.value = number
26 | }
27 |
28 | init(_ number: Int) {
29 | self.value = NSNumber(value: number)
30 | }
31 |
32 | init(_ number: Double) {
33 | self.value = NSNumber(value: number)
34 | }
35 | }
36 |
37 | struct StringElement: ElementType {
38 | let value: String
39 | let type: Type.RawType = .string
40 |
41 | init(_ string: String) {
42 | self.value = string
43 | }
44 |
45 | var description: String {
46 | return "\"\(value)\""
47 | }
48 | }
49 |
50 | struct BooleanElement: ElementType {
51 | let value: Bool
52 | let type: Type.RawType = .boolean
53 |
54 | init(_ bool: Bool) {
55 | self.value = bool
56 | }
57 | }
58 |
59 | struct NullElement: ElementType {
60 | let value: NSNull
61 | let type: Type.RawType = .null
62 |
63 | init(_ null: NSNull) {
64 | self.value = null
65 | }
66 |
67 | init() {
68 | self.value = NSNull()
69 | }
70 | }
71 |
72 | struct ArrayElement: ElementType {
73 | let value: ElementArray
74 | let type: Type.RawType = .array
75 |
76 | init(_ array: ElementArray) {
77 | self.value = array
78 | }
79 | }
80 |
81 | struct DictionaryElement: ElementType {
82 | let value: ElementDictionary
83 | let type: Type.RawType = .dictionary
84 |
85 | init(_ dictionary: ElementDictionary) {
86 | self.value = dictionary
87 | }
88 | }
89 |
90 | struct RegexElement: ElementType {
91 | let value: NSRegularExpression
92 | let type: Type.RawType = .unknown
93 |
94 | init(_ regex: NSRegularExpression) {
95 | self.value = regex
96 | }
97 | }
98 |
99 | struct TypeElement: ElementType {
100 | let value: Type
101 | let type: Type.RawType = .unknown
102 |
103 | init(_ type: Type) {
104 | self.value = type
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ### https://raw.github.com/github/gitignore/95bdb4e35df6f7b736f2e95dd53ef11f2a8a439e/Swift.gitignore
2 |
3 | # Xcode
4 | #
5 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
6 |
7 | ## Build generated
8 | build/
9 | DerivedData
10 |
11 | ## Various settings
12 | *.pbxuser
13 | !default.pbxuser
14 | *.mode1v3
15 | !default.mode1v3
16 | *.mode2v3
17 | !default.mode2v3
18 | *.perspectivev3
19 | !default.perspectivev3
20 | xcuserdata
21 |
22 | ## Other
23 | *.xccheckout
24 | *.moved-aside
25 | *.xcuserstate
26 | *.xcscmblueprint
27 |
28 | ## Obj-C/Swift specific
29 | *.hmap
30 | *.ipa
31 |
32 | # CocoaPods
33 | #
34 | # We recommend against adding the Pods directory to your .gitignore. However
35 | # you should judge for yourself, the pros and cons are mentioned at:
36 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
37 | #
38 | # Pods/
39 |
40 | # Carthage
41 | #
42 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
43 | # Carthage/Checkouts
44 |
45 | Carthage/Build
46 |
47 | # fastlane
48 | #
49 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
50 | # screenshots whenever they are needed.
51 |
52 | fastlane/report.xml
53 | fastlane/screenshots
54 |
55 |
56 | ### https://raw.github.com/github/gitignore/95bdb4e35df6f7b736f2e95dd53ef11f2a8a439e/Objective-C.gitignore
57 |
58 | # Xcode
59 | #
60 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
61 |
62 | ## Build generated
63 | build/
64 | DerivedData
65 |
66 | ## Various settings
67 | *.pbxuser
68 | !default.pbxuser
69 | *.mode1v3
70 | !default.mode1v3
71 | *.mode2v3
72 | !default.mode2v3
73 | *.perspectivev3
74 | !default.perspectivev3
75 | xcuserdata
76 |
77 | ## Other
78 | *.xccheckout
79 | *.moved-aside
80 | *.xcuserstate
81 | *.xcscmblueprint
82 |
83 | ## Obj-C/Swift specific
84 | *.hmap
85 | *.ipa
86 |
87 | # CocoaPods
88 | #
89 | # We recommend against adding the Pods directory to your .gitignore. However
90 | # you should judge for yourself, the pros and cons are mentioned at:
91 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
92 | #
93 | # Pods/
94 |
95 | # Carthage
96 | #
97 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
98 | # Carthage/Checkouts
99 |
100 | Carthage/Build
101 |
102 | # fastlane
103 | #
104 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
105 | # screenshots whenever they are needed.
106 |
107 | fastlane/report.xml
108 | fastlane/screenshots
109 |
110 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Builder.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 |
3 | struct Builder {
4 | func buildJSONElement(_ object: T) -> BaseElementType {
5 | switch object {
6 | case let array as NSArray:
7 | let array = buildJSONElementArray(array)
8 | return ArrayElement(array)
9 | case let dictionary as NSDictionary:
10 | let dictionary = buildJSONElementDictionary(dictionary)
11 | return DictionaryElement(dictionary)
12 | default:
13 | return buildRawJSONElement(object)
14 | }
15 | }
16 |
17 | private func buildRawJSONElement(_ object: T) -> BaseElementType {
18 | switch object {
19 | case let double as Double:
20 | let number = NSNumber(value: double)
21 | return NumberElement(number)
22 | case let int as Int:
23 | let number = NSNumber(value: int)
24 | return NumberElement(number)
25 | case let bool as Bool:
26 | return BooleanElement(bool)
27 | case let string as String:
28 | return StringElement(string)
29 | case let null as NSNull:
30 | return NullElement(null)
31 | case let regex as NSRegularExpression:
32 | return RegexElement(regex)
33 | case let type as Type:
34 | return TypeElement(type)
35 | default:
36 | return NullElement(NSNull())
37 | }
38 | }
39 |
40 | private func buildJSONElementArray(_ array: NSArray) -> ElementArray {
41 | var result: ElementArray = []
42 | for element in array {
43 | if let innerRawArray = element as? NSArray {
44 | let innerArray = buildJSONElementArray(innerRawArray)
45 | let arrayElement = ArrayElement(innerArray)
46 | result.append(arrayElement)
47 | } else if let innerRawDictionary = element as? NSDictionary {
48 | let innerDictionary = buildJSONElementDictionary(innerRawDictionary)
49 | let dictionaryElement = DictionaryElement(innerDictionary)
50 | result.append(dictionaryElement)
51 | } else {
52 | let rawElement = buildRawJSONElement(element)
53 | result.append(rawElement)
54 | }
55 | }
56 | return result
57 | }
58 |
59 | private func buildJSONElementDictionary(_ dictionary: NSDictionary) -> ElementDictionary {
60 | var result: ElementDictionary = [:]
61 | for (k, v) in dictionary {
62 | guard let k = k as? String else {
63 | continue
64 | }
65 | if let innerRawArray = v as? NSArray {
66 | let innerArray = buildJSONElementArray(innerRawArray)
67 | let arrayElement = ArrayElement(innerArray)
68 | result[k] = arrayElement
69 | } else if let innerRawDictionary = v as? NSDictionary {
70 | let innerDictionary = buildJSONElementDictionary(innerRawDictionary)
71 | let dictionaryElement = DictionaryElement(innerDictionary)
72 | result[k] = dictionaryElement
73 | } else {
74 | let rawElement = buildRawJSONElement(v)
75 | result[k] = rawElement
76 | }
77 | }
78 | return result
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/BeJSONAsTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class BeJSONAsTestCase: BaseTestCase {
6 | let pokedex: [String: Any] = [
7 | "name": "Snorlax",
8 | "no": 143,
9 | "species": "Sleeping",
10 | "type": ["normal"],
11 | "stats": [
12 | "hp": 160,
13 | "attack": 110,
14 | "defense": 65,
15 | "special_attack": 65,
16 | "special_defense": 65,
17 | "speed": 30
18 | ]
19 | ]
20 |
21 | func testBeJSONAsExactMatch() {
22 | expect("{\"name\": \"Snorlax\"}").to(beJSONAs(["name": "Snorlax"]))
23 | }
24 |
25 | func testBeJSONAsTypeMatching() {
26 | expect("{\"name\": \"Snorlax\"}").to(beJSONAs(["name": Type.String]))
27 | }
28 |
29 | func testBeJSONAsRegexMatching() {
30 | expect("{\"name\": \"Snorlax\"}").to(beJSONAs(["name": "^S".regex]))
31 | }
32 |
33 | func testBeJSONAsWithDifferentKey() {
34 | let expected: [String: Any] = [
35 | "name": "Snorlax",
36 | "no": 143,
37 | "species": "Sleeping",
38 | "type": ["normal"],
39 | "stats": [
40 | "hp": 160,
41 | "invalid": 110,
42 | "defense": 65,
43 | "special_attack": 65,
44 | "special_defense": 65,
45 | "speed": 30
46 | ]
47 | ]
48 | expect(self.pokedex).toNot(beJSONAs(expected))
49 | }
50 |
51 | func testBeJSONAsExactMatchWithObject() {
52 | let expected: [String: Any] = [
53 | "name": "Snorlax",
54 | "no": 143,
55 | "species": "Sleeping",
56 | "type": ["normal"],
57 | "stats": [
58 | "hp": 160,
59 | "attack": 110,
60 | "defense": 65,
61 | "special_attack": 65,
62 | "special_defense": 65,
63 | "speed": 30
64 | ]
65 | ]
66 | expect(self.pokedex).to(beJSONAs(expected))
67 | }
68 |
69 | func testBeJSONAsTypeWithObject() {
70 | let expected: [String: Any] = [
71 | "name": Type.String,
72 | "no": 143,
73 | "species": "Sleeping",
74 | "type": ["n+".regex],
75 | "stats": [
76 | "hp": 160,
77 | "attack": 110,
78 | "defense": 65,
79 | "special_attack": 65,
80 | "special_defense": 65,
81 | "speed": 30
82 | ]
83 | ]
84 | expect(self.pokedex).to(beJSONAs(expected))
85 | }
86 |
87 | func testBeJSONAsWithJSONString() {
88 | let snorlax = loadJSONFile("snorlax")
89 | expect(snorlax).to(beJSONAs(self.pokedex))
90 | }
91 |
92 | func testComplexJSON() {
93 | let pikachu = loadJSONFile("pikachu")
94 | let expected = try! JSONSerialization.jsonObject(with: pikachu.data(using: .utf8)!, options: [])
95 | expect(pikachu).to(beJSONAs(expected))
96 | }
97 |
98 | func testFailureMessages() {
99 | failsWithErrorMessage("expected to equal to <[\"name\": \"Pikachu\"]>, got <[\"name\": \"Snorlax\"]>") {
100 | expect(["name": "Snorlax"]).to(beJSONAs(["name": "Pikachu"]))
101 | }
102 | failsWithErrorMessage("expected to not equal to <[\"name\": \"Snorlax\"]>, got <[\"name\": \"Snorlax\"]>") {
103 | expect(["name": "Snorlax"]).toNot(beJSONAs(["name": "Snorlax"]))
104 | }
105 | }
106 | }
107 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | JSONMatcher
2 | =================
3 |
4 | [](https://travis-ci.org/giginet/JSONMatcher)
5 | [](https://codecov.io/gh/giginet/JSONMatcher)
6 | [](https://img.shields.io/cocoapods/v/JSONMatcher.svg)
7 | [](https://github.com/Carthage/Carthage)
8 | [](https://github.com/apple/swift-package-manager)
9 | [](http://cocoadocs.org/docsets/JSONMatcher)
10 |
11 | JSONMatcher is a JSON matcher library for Swift testing. It works as an extension for [Nimble](https://github.com/Quick/Nimble/).
12 |
13 | This library is inspired by [rspec-json_matcher](https://github.com/r7kamura/rspec-json_matcher).
14 |
15 | ## Usage
16 |
17 | ### Example
18 |
19 | ```swift
20 | import XCTest
21 | import Nimble
22 | import JSONMatcher
23 |
24 | class ExampleTestCase: XCTestCase {
25 | func testComplexExample() {
26 | expect([
27 | "name" : "Snorlax",
28 | "no" : 143,
29 | "species" : "Sleeping",
30 | "type" : ["normal"],
31 | "stats" : [
32 | "hp" : 160,
33 | "attack" : 110,
34 | "defense" : 65,
35 | "special_attack" : 65,
36 | "special_defense" : 65,
37 | "speed" : 30
38 | ],
39 | "moves" : [
40 | ["name" : "Tackle", "type" : "normal", "level" : 1],
41 | ["name" : "Hyper Beam", "type" : "normal", "level" : NSNull()],
42 | ]
43 | ]).to(beJSONAs([
44 | "name" : "Snorlax",
45 | "no" : Type.Number, // value type matching
46 | "species" : try! NSRegularExpression(pattern: "[A-Z][a-z]+", options: []), // regular expression matching
47 | "type" : ["[a-z]+".regex], // shorthands for NSRegularExpression
48 | "stats" : [
49 | "hp" : 160,
50 | "attack" : 110,
51 | "defense" : 65,
52 | "special_attack" : 65,
53 | "special_defense" : 65,
54 | "speed" : 30
55 | ],
56 | "moves" : [
57 | ["name" : "Tackle", "type" : "[a-z]+".regex, "level" : Type.Number], // nested collection
58 | ["name" : "Hyper Beam", "type" : "normal", "level" : NSNull()],
59 | ]
60 | ]))
61 | }
62 | }
63 | ```
64 |
65 | ### Matcher
66 |
67 | - beJSON
68 | - beJSONIncluding
69 | - beJSONAs
70 |
71 | ```swift
72 | expect("{\"name\": \"Pikachu\"}").to(beJSON())
73 | expect(["name" : "Pikachu", "no" : 25]).to(beJSONIncluding(["name" : "Pikachu"]))
74 | expect(["name" : "Pikachu", "no" : 25]).to(beJSONAs(["name": "Pikachu", "no" : 25]))
75 | ```
76 |
77 | ## Requirements
78 |
79 | ### Supported Swift Version
80 |
81 | - Swift 2.2
82 |
83 | ### Dependencies
84 |
85 | - Nimble >= 4.0.0
86 |
87 | ### Supported Platforms
88 |
89 | - iOS 8.0 or above
90 | - OSX 10.9 or above
91 | - tvOS 9.0 or above
92 |
93 | ## Installation
94 |
95 | ### Carthage
96 |
97 | Declare following in your `Cartfile.private`.
98 |
99 | ```
100 | github "giginet/JSONMatcher"
101 | ```
102 |
103 | ### CocoaPods
104 |
105 | Declare following in your `Podfile`.
106 |
107 | ```ruby
108 | use_frameworks!
109 |
110 | target "YourApplicationTests" do
111 | pod 'JSONMatcher'
112 | end
113 | ```
114 |
115 | ## Author
116 |
117 | giginet <>
118 |
119 | ## License
120 |
121 | MIT License
122 |
--------------------------------------------------------------------------------
/JSONMatcher.xcodeproj/xcshareddata/xcschemes/JSONMatcher-OSX.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
53 |
54 |
64 |
65 |
71 |
72 |
73 |
74 |
75 |
76 |
82 |
83 |
89 |
90 |
91 |
92 |
94 |
95 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/JSONMatcher.xcodeproj/xcshareddata/xcschemes/JSONMatcher-tvOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
33 |
39 |
40 |
41 |
42 |
43 |
49 |
50 |
51 |
52 |
53 |
54 |
64 |
65 |
71 |
72 |
73 |
74 |
75 |
76 |
82 |
83 |
89 |
90 |
91 |
92 |
94 |
95 |
98 |
99 |
100 |
--------------------------------------------------------------------------------
/JSONMatcher.xcodeproj/xcshareddata/xcschemes/JSONMatcher-iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
31 |
32 |
34 |
40 |
41 |
42 |
43 |
44 |
50 |
51 |
52 |
53 |
54 |
55 |
65 |
66 |
72 |
73 |
74 |
75 |
76 |
77 |
83 |
84 |
90 |
91 |
92 |
93 |
95 |
96 |
99 |
100 |
101 |
--------------------------------------------------------------------------------
/Sources/JSONMatcher/Comparer.swift:
--------------------------------------------------------------------------------
1 | import Foundation
2 | import Nimble
3 |
4 | struct Comparer {
5 | func compare(_ lhs: T, _ rhs: U) -> Bool {
6 | return self.compareRawValueType(lhs, rhs)
7 | }
8 |
9 | func include(_ lhs: T, _ rhs: U) -> Bool {
10 | return self.includeRawValueType(lhs, rhs)
11 | }
12 |
13 | private func compareArray(_ lhs: ArrayElement, _ rhs: ArrayElement) -> Bool {
14 | guard lhs.value.count == rhs.value.count else {
15 | return false
16 | }
17 |
18 | for (element0, element1) in zip(lhs.value, rhs.value) {
19 | if (!compareRawValueType(element0, element1)) {
20 | return false
21 | }
22 | }
23 | return true
24 | }
25 |
26 | private func compareDictionary(_ lhs: DictionaryElement, _ rhs: DictionaryElement) -> Bool {
27 | guard lhs.value.count == rhs.value.count else {
28 | return false
29 | }
30 |
31 | for (k0, v0) in lhs.value {
32 | if let v1 = rhs.value[k0] {
33 | if !compareRawValueType(v0, v1) {
34 | return false
35 | }
36 | } else {
37 | return false
38 | }
39 | }
40 | return true
41 | }
42 |
43 | private func compareRawValueType(_ lhs: T, _ rhs: U) -> Bool {
44 | switch (lhs, rhs) {
45 | case let (number as NumberElement, expectedNumber as NumberElement):
46 | return number.value == expectedNumber.value
47 | case let (string as StringElement, expectedString as StringElement):
48 | return string.value == expectedString.value
49 | case let (bool as BooleanElement, expectedBool as BooleanElement):
50 | return bool.value == expectedBool.value
51 | case let (null as NullElement, expectedNull as NullElement):
52 | return null.value == expectedNull.value
53 | case let (array as ArrayElement, expectedArray as ArrayElement):
54 | return compareArray(array, expectedArray)
55 | case let (dictionary as DictionaryElement, expectedDictionary as DictionaryElement):
56 | return compareDictionary(dictionary, expectedDictionary)
57 | case let (string as StringElement, regex as RegexElement):
58 | return regex.value.match(string.value)
59 | case let (lhs as NumberElement, rhs as TypeElement):
60 | return lhs.type == rhs.value.rawType
61 | case let (lhs as StringElement, rhs as TypeElement):
62 | return lhs.type == rhs.value.rawType
63 | case let (lhs as BooleanElement, rhs as TypeElement):
64 | return lhs.type == rhs.value.rawType
65 | case let (lhs as ArrayElement, rhs as TypeElement):
66 | return lhs.type == rhs.value.rawType
67 | case let (lhs as DictionaryElement, rhs as TypeElement):
68 | return lhs.type == rhs.value.rawType
69 | case let (lhs as NullElement, rhs as TypeElement):
70 | return lhs.type == rhs.value.rawType
71 | default:
72 | return false
73 | }
74 | }
75 |
76 | private func includeRawValueType(_ lhs: T, _ rhs: U) -> Bool {
77 | if let lhs = lhs as? ArrayElement {
78 | for element in lhs.value {
79 | if includeRawValueType(element, rhs) {
80 | return true
81 | }
82 | }
83 | } else if let lhs = lhs as? DictionaryElement,
84 | let rhs = rhs as? DictionaryElement {
85 | if includeDictionary(lhs, rhs) {
86 | return true
87 | }
88 | if lhs.value.values.contains(where: { includeRawValueType($0, rhs) }) {
89 | return true
90 | }
91 | } else if let lhs = lhs as? DictionaryElement {
92 | for (_, value) in lhs.value {
93 | if includeRawValueType(value, rhs) {
94 | return true
95 | }
96 | }
97 | }
98 | return self.compareRawValueType(lhs, rhs)
99 | }
100 |
101 | private func includeDictionary(_ lhs: DictionaryElement, _ rhs: DictionaryElement) -> Bool {
102 | for (key1, value1) in rhs.value {
103 | if let value0 = lhs.value[key1] {
104 | if !includeRawValueType(value0, value1) {
105 | return false
106 | }
107 | } else {
108 | return false
109 | }
110 | }
111 | return true
112 | }
113 | }
114 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/BuilderTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class Model { }
6 |
7 | class BuilderTestCase: XCTestCase {
8 | var builder: Builder!
9 |
10 | override func setUp() {
11 | super.setUp()
12 | self.builder = Builder()
13 | }
14 |
15 | func testNumber() {
16 | let number0 = self.builder.buildJSONElement(10) as! NumberElement
17 | expect(number0.value).to(equal(10.0))
18 | let number1 = self.builder.buildJSONElement(10.5) as! NumberElement
19 | expect(number1.value).to(equal(10.5))
20 | }
21 |
22 | func testString() {
23 | let string0 = self.builder.buildJSONElement("sushi") as! StringElement
24 | expect(string0.value).to(equal("sushi"))
25 | }
26 |
27 | func testBoolean() {
28 | let bool0 = self.builder.buildJSONElement(true) as! BooleanElement
29 | let bool1 = self.builder.buildJSONElement(false) as! BooleanElement
30 | expect(bool0.value).to(equal(true))
31 | expect(bool1.value).to(equal(false))
32 | }
33 |
34 | func testNull() {
35 | let null0 = self.builder.buildJSONElement(NSNull()) as! NullElement
36 | expect(null0.value).to(equal(NSNull()))
37 | }
38 |
39 | func testUnknown() {
40 | let null0 = self.builder.buildJSONElement(Model()) as! NullElement
41 | expect(null0.value).to(equal(NSNull()))
42 | }
43 |
44 | func testRegex() {
45 | let regex0 = self.builder.buildJSONElement(".+".regex) as! RegexElement
46 | expect(regex0.value.pattern).to(equal(".+"))
47 | }
48 |
49 | func testType() {
50 | let type0 = self.builder.buildJSONElement(Type.Number) as! TypeElement
51 | expect(type0.value).to(equal(Type.Number))
52 | }
53 |
54 | func testArray() {
55 | let array0 = self.builder.buildJSONElement([
56 | 42,
57 | 10.5,
58 | "🍺",
59 | true,
60 | NSNull(),
61 | Model(),
62 | ".+".regex,
63 | Type.Number,
64 | ["Bulbasaur", "Charmander", "Squirtle", "Pikachu"],
65 | ["Grass": "Bulbasaur", "Water": "Squirtle", "Fire": "Charmander"],
66 | ]) as! ArrayElement
67 | if let element = array0.value[0] as? NumberElement {
68 | expect(element.value).to(equal(42))
69 | }
70 | if let element = array0.value[1] as? NumberElement {
71 | expect(element.value).to(equal(10.5))
72 | }
73 | if let element = array0.value[2] as? StringElement {
74 | expect(element.value).to(equal("🍺"))
75 | }
76 | if let element = array0.value[3] as? BooleanElement {
77 | expect(element.value).to(equal(true))
78 | }
79 | if let element = array0.value[4] as? NullElement {
80 | expect(element.value).to(equal(NSNull()))
81 | }
82 | if let element = array0.value[5] as? NullElement {
83 | expect(element.value).to(equal(NSNull()))
84 | }
85 | if let element = array0.value[6] as? RegexElement {
86 | expect(element.value.pattern).to(equal(".+"))
87 | }
88 | if let element = array0.value[7] as? TypeElement {
89 | expect(element.value).to(equal(Type.Number))
90 | }
91 | if let element = array0.value[8] as? ArrayElement {
92 | expect(element.value.count).to(equal(4))
93 | if let element0 = element.value[0] as? StringElement {
94 | expect(element0.value).to(equal("Bulbasaur"))
95 | }
96 | if let element1 = element.value[1] as? StringElement {
97 | expect(element1.value).to(equal("Charmander"))
98 | }
99 | if let element2 = element.value[2] as? StringElement {
100 | expect(element2.value).to(equal("Squirtle"))
101 | }
102 | if let element3 = element.value[3] as? StringElement {
103 | expect(element3.value).to(equal("Pikachu"))
104 | }
105 | }
106 | if let element = array0.value[9] as? DictionaryElement {
107 | expect(element.value.count).to(equal(3))
108 | if let element0 = element.value["Grass"] as? StringElement {
109 | expect(element0.value).to(equal("Bulbasaur"))
110 | }
111 | if let element1 = element.value["Water"] as? StringElement {
112 | expect(element1.value).to(equal("Squirtle"))
113 | }
114 | if let element2 = element.value["Fire"] as? StringElement {
115 | expect(element2.value).to(equal("Charmander"))
116 | }
117 | }
118 | }
119 |
120 | func testDictionary() {
121 | let dictionary = self.builder.buildJSONElement([
122 | "int": 42,
123 | "double": 10.5,
124 | "string": "🍺",
125 | "bool": true,
126 | "null": NSNull(),
127 | "unknown": Model(),
128 | "regex": ".+".regex,
129 | "type": Type.Number,
130 | "array": ["Bulbasaur", "Charmander", "Squirtle", "Pikachu"],
131 | "dictionary": ["Grass": "Bulbasaur", "Water": "Squirtle", "Fire": "Charmander"]
132 | ]) as! DictionaryElement
133 | if let element = dictionary.value["int"] as? NumberElement {
134 | expect(element.value).to(equal(42))
135 | }
136 | if let element = dictionary.value["double"] as? NumberElement {
137 | expect(element.value).to(equal(10.5))
138 | }
139 | if let element = dictionary.value["string"] as? StringElement {
140 | expect(element.value).to(equal("🍺"))
141 | }
142 | if let element = dictionary.value["bool"] as? BooleanElement {
143 | expect(element.value).to(equal(true))
144 | }
145 | if let element = dictionary.value["null"] as? NullElement {
146 | expect(element.value).to(equal(NSNull()))
147 | }
148 | if let element = dictionary.value["unknown"] as? NullElement {
149 | expect(element.value).to(equal(NSNull()))
150 | }
151 | if let element = dictionary.value["regex"] as? RegexElement {
152 | expect(element.value.pattern).to(equal(".+"))
153 | }
154 | if let element = dictionary.value["type"] as? TypeElement {
155 | expect(element.value).to(equal(Type.Number))
156 | }
157 | if let element = dictionary.value["array"] as? ArrayElement {
158 | expect(element.value.count).to(equal(4))
159 | if let element0 = element.value[0] as? StringElement {
160 | expect(element0.value).to(equal("Bulbasaur"))
161 | }
162 | if let element1 = element.value[1] as? StringElement {
163 | expect(element1.value).to(equal("Charmander"))
164 | }
165 | if let element2 = element.value[2] as? StringElement {
166 | expect(element2.value).to(equal("Squirtle"))
167 | }
168 | if let element3 = element.value[3] as? StringElement {
169 | expect(element3.value).to(equal("Pikachu"))
170 | }
171 | }
172 | if let element = dictionary.value["dictionary"] as? DictionaryElement {
173 | expect(element.value.count).to(equal(3))
174 | if let element0 = element.value["Grass"] as? StringElement {
175 | expect(element0.value).to(equal("Bulbasaur"))
176 | }
177 | if let element1 = element.value["Fire"] as? StringElement {
178 | expect(element1.value).to(equal("Charmander"))
179 | }
180 | if let element2 = element.value["Water"] as? StringElement {
181 | expect(element2.value).to(equal("Squirtle"))
182 | }
183 | }
184 | }
185 |
186 | func testRecursiveArray() {
187 | let array = self.builder.buildJSONElement(["a", "b", "c", ["d", "e", ["f", "g", ["h"]]]]) as! ArrayElement
188 | if let array = array.value[3] as? ArrayElement {
189 | if let array = array.value[2] as? ArrayElement {
190 | if let array = array.value[2] as? ArrayElement {
191 | if let string = array.value[0] as? StringElement {
192 | expect(string.value).to(equal("h"))
193 | }
194 | }
195 | }
196 | }
197 | }
198 |
199 | func testRecursiveDictionary() {
200 | let dictionary = self.builder.buildJSONElement([
201 | "a": ["b": ["c": ["d": ["e", "f", "g", "h"]]]]
202 | ]) as! DictionaryElement
203 | if let dictionary = dictionary.value["a"] as? DictionaryElement {
204 | if let dictionary = dictionary.value["b"] as? DictionaryElement {
205 | if let dictionary = dictionary.value["c"] as? DictionaryElement {
206 | if let array = dictionary.value["d"] as? ArrayElement {
207 | if let string = array.value[0] as? StringElement {
208 | expect(string.value).to(equal("e"))
209 | }
210 | }
211 | }
212 | }
213 | }
214 | }
215 | }
216 |
--------------------------------------------------------------------------------
/Tests/JSONMatcher/ComparerTests.swift:
--------------------------------------------------------------------------------
1 | import XCTest
2 | import Nimble
3 | @testable import JSONMatcher
4 |
5 | class CompareTestCase: XCTestCase {
6 | var comparer: Comparer!
7 |
8 | override func setUp() {
9 | super.setUp()
10 | self.comparer = Comparer()
11 | }
12 |
13 | func testSimpleStringElement() {
14 | expect(self.comparer.compare(StringElement("foo"),
15 | StringElement("foo"))).to(beTrue())
16 | expect(self.comparer.compare(StringElement("foo"),
17 | StringElement("bar"))).to(beFalse())
18 | }
19 |
20 | func testSimpleNumberElement() {
21 | expect(self.comparer.compare(NumberElement(10),
22 | NumberElement(10))).to(beTrue())
23 | expect(self.comparer.compare(NumberElement(10),
24 | NumberElement(10.0))).to(beTrue())
25 | expect(self.comparer.compare(NumberElement(16),
26 | NumberElement(0x10))).to(beTrue())
27 | expect(self.comparer.compare(NumberElement(30),
28 | NumberElement(30.0000001))).to(beFalse())
29 | }
30 |
31 | func testSimpleBoolElement() {
32 | expect(self.comparer.compare(BooleanElement(true),
33 | BooleanElement(true))).to(beTrue())
34 | expect(self.comparer.compare(BooleanElement(false),
35 | BooleanElement(true))).to(beFalse())
36 | }
37 |
38 | func testSimpleNilElement() {
39 | expect(self.comparer.compare(NullElement(), NullElement())).to(beTrue())
40 | }
41 |
42 | func testSimpleRegex() {
43 | expect(self.comparer.compare(StringElement("foo"),
44 | RegexElement(".+".regex))).to(beTrue())
45 | expect(self.comparer.compare(StringElement("10"),
46 | RegexElement("[0-9]{2}".regex))).to(beTrue())
47 | expect(self.comparer.compare(StringElement("10"),
48 | RegexElement(try! NSRegularExpression(pattern: "[0-9]+", options: [])))).to(beTrue())
49 | expect(self.comparer.compare(NumberElement(10),
50 | RegexElement("10".regex))).to(beFalse())
51 | expect(self.comparer.compare(BooleanElement(false),
52 | RegexElement(".+".regex))).to(beFalse())
53 | }
54 |
55 | func testSimpleType() {
56 | expect(self.comparer.compare(NumberElement(42),
57 | TypeElement(Type.Number))).to(beTrue())
58 | expect(self.comparer.compare(NumberElement(42.195),
59 | TypeElement(Type.Number))).to(beTrue())
60 | expect(self.comparer.compare(StringElement("sushi"),
61 | TypeElement(Type.Number))).to(beFalse())
62 | expect(self.comparer.compare(StringElement("🍣"),
63 | TypeElement(Type.String))).to(beTrue())
64 | expect(self.comparer.compare(BooleanElement(true),
65 | TypeElement(Type.Boolean))).to(beTrue())
66 | expect(self.comparer.compare(BooleanElement(false),
67 | TypeElement(Type.Boolean))).to(beTrue())
68 | expect(self.comparer.compare(NullElement(NSNull()),
69 | TypeElement(Type.Null))).to(beTrue())
70 | expect(self.comparer.compare(ArrayElement([
71 | StringElement("a"),
72 | StringElement("b"),
73 | StringElement("c"), ]
74 | ), TypeElement(Type.Array))).to(beTrue())
75 | expect(self.comparer.compare(DictionaryElement([
76 | "a": StringElement("a"),
77 | "b": StringElement("b"),
78 | "c": StringElement("c"), ]
79 | ), TypeElement(Type.Dictionary))).to(beTrue())
80 |
81 | }
82 |
83 | func testSimpleArray() {
84 | expect(self.comparer.compare(
85 | ArrayElement([NumberElement(10), NumberElement(20)]),
86 | ArrayElement([NumberElement(10), NumberElement(20)]))
87 | ).to(beTrue())
88 | expect(self.comparer.compare(
89 | ArrayElement([NumberElement(10), StringElement("foo"), BooleanElement(true)]),
90 | ArrayElement([NumberElement(10), StringElement("foo"), BooleanElement(true)]))
91 | ).to(beTrue())
92 | expect(self.comparer.compare(
93 | ArrayElement([NumberElement(10), NumberElement(20)]),
94 | ArrayElement([NumberElement(10), NumberElement(20), NumberElement(30)]))
95 | ).to(beFalse())
96 | expect(self.comparer.compare(
97 | ArrayElement([NumberElement(10), NumberElement(20)]),
98 | ArrayElement([StringElement("10"), StringElement("20")]))
99 | ).to(beFalse())
100 | }
101 |
102 | func testSimpleDictionary() {
103 | expect(self.comparer.compare(
104 | DictionaryElement(["name": StringElement("Jigglypuff"), "no": NumberElement(39)]),
105 | DictionaryElement(["name": StringElement("Jigglypuff"), "no": NumberElement(39)]))
106 | ).to(beTrue())
107 | }
108 |
109 | func testArrayWithRegex() {
110 | expect(self.comparer.compare(
111 | ArrayElement([NumberElement(10), StringElement("foo"), StringElement("bar"), StringElement("apple")]),
112 | ArrayElement([
113 | NumberElement(10),
114 | RegexElement("f+".regex),
115 | StringElement("bar"),
116 | RegexElement("[a-z]+".regex)
117 | ]))
118 | ).to(beTrue())
119 | }
120 |
121 | func testArrayWithType() {
122 | expect(self.comparer.compare(
123 | ArrayElement([NumberElement(10), StringElement("foo"), StringElement("bar")]),
124 | ArrayElement([TypeElement(Type.Number), TypeElement(Type.String), StringElement("bar")]))
125 | ).to(beTrue())
126 | }
127 |
128 | func testRecursiveArray() {
129 | expect(self.comparer.compare(
130 | ArrayElement([
131 | StringElement("Articuno"),
132 | ArrayElement([ArrayElement([ArrayElement([StringElement("Zapdos")]), StringElement("Moltres")])])]),
133 | ArrayElement([
134 | TypeElement(Type.String),
135 | ArrayElement([ArrayElement([
136 | ArrayElement([StringElement("Zapdos")]),
137 | RegexElement("[A-Z][a-z].+".regex)
138 | ])])
139 | ]))
140 | ).to(beTrue())
141 | expect(self.comparer.compare(
142 | ArrayElement([
143 | StringElement("Articuno"),
144 | ArrayElement([ArrayElement([ArrayElement([
145 | StringElement("Zapdos")
146 | ]), StringElement("Moltres")])])
147 | ]),
148 | ArrayElement([
149 | TypeElement(Type.String),
150 | ArrayElement([ArrayElement([ArrayElement([
151 | StringElement("Jigglypuff")
152 | ]), RegexElement("[A-Z][a-z].+".regex)])])
153 | ]))
154 | ).to(beFalse())
155 | }
156 |
157 | func testRecursiveDictionary() {
158 | expect(self.comparer.compare(
159 | DictionaryElement(["moves": DictionaryElement([
160 | "name": StringElement("Swift"),
161 | "type": StringElement("normal")
162 | ])]),
163 | DictionaryElement(["moves": DictionaryElement([
164 | "name": StringElement("Swift"),
165 | "type": StringElement("normal")
166 | ])]))
167 | ).to(beTrue())
168 | expect(self.comparer.compare(
169 | DictionaryElement(["moves": DictionaryElement([
170 | "name": StringElement("Swift"),
171 | "type": StringElement("normal")
172 | ])]),
173 | DictionaryElement(["moves": DictionaryElement([
174 | "type": StringElement("Swift"),
175 | "name": StringElement("normal")
176 | ])]))
177 | ).to(beFalse())
178 | expect(self.comparer.compare(
179 | DictionaryElement(["moves": DictionaryElement([
180 | "name": StringElement("Swift"),
181 | "type": StringElement("normal")
182 | ])]),
183 | DictionaryElement(["moves": DictionaryElement([
184 | "invalid": StringElement("Swift"),
185 | "type": StringElement("normal")
186 | ])]))
187 | ).to(beFalse())
188 | }
189 |
190 | func testComplexObject() {
191 | expect(self.comparer.compare(DictionaryElement([
192 | "name": StringElement("Charizard"),
193 | "no": NumberElement(6),
194 | "species": StringElement("Flame"),
195 | "type": ArrayElement([StringElement("Fire"), StringElement("Frying")]),
196 | "stats": DictionaryElement([
197 | "hp": NumberElement(78),
198 | "attack": NumberElement(84),
199 | "defense": NumberElement(78),
200 | "special_attack": NumberElement(109),
201 | "special_defense": NumberElement(85),
202 | "speed": NumberElement(100)
203 | ])
204 | ]), DictionaryElement([
205 | "name": RegexElement("C.+".regex),
206 | "no": TypeElement(Type.Number),
207 | "species": StringElement("Flame"),
208 | "type": ArrayElement([StringElement("Fire"), StringElement("Frying")]),
209 | "stats": DictionaryElement([
210 | "hp": NumberElement(78),
211 | "attack": NumberElement(84),
212 | "defense": NumberElement(78),
213 | "special_attack": NumberElement(109),
214 | "special_defense": NumberElement(85),
215 | "speed": NumberElement(100)
216 | ])
217 | ]))).to(beTrue())
218 | }
219 | }
220 |
221 | class IncludeTestCase: XCTestCase {
222 | var comparer: Comparer!
223 |
224 | override func setUp() {
225 | super.setUp()
226 | self.comparer = Comparer()
227 | }
228 |
229 | func testIncludeExactMatch() {
230 | expect(self.comparer.include(NumberElement(151), NumberElement(151))).to(beTrue())
231 | expect(self.comparer.include(NumberElement(10.5), NumberElement(10.5))).to(beTrue())
232 | expect(self.comparer.include(StringElement("Mew"), StringElement("Mew"))).to(beTrue())
233 | expect(self.comparer.include(BooleanElement(true), BooleanElement(true))).to(beTrue())
234 | expect(self.comparer.include(NullElement(NSNull()), NullElement(NSNull()))).to(beTrue())
235 | expect(self.comparer.include(StringElement("Eevee"), RegexElement("E.+".regex))).to(beTrue())
236 | expect(self.comparer.include(StringElement("Jigglypuff"), TypeElement(Type.String))).to(beTrue())
237 |
238 | expect(self.comparer.include(NumberElement(151), NumberElement(1))).to(beFalse())
239 | expect(self.comparer.include(NumberElement(10.5), NumberElement(1.5))).to(beFalse())
240 | expect(self.comparer.include(StringElement("Mew"), StringElement("Mewtwo"))).to(beFalse())
241 | expect(self.comparer.include(BooleanElement(true), BooleanElement(false))).to(beFalse())
242 | expect(self.comparer.include(NullElement(NSNull()), StringElement("Hi"))).to(beFalse())
243 | expect(self.comparer.include(StringElement("Eevee"), RegexElement("a+".regex))).to(beFalse())
244 | expect(self.comparer.include(StringElement("Jigglypuff"), TypeElement(Type.Number))).to(beFalse())
245 | }
246 |
247 | func testIncludeArray() {
248 | let array = ArrayElement([
249 | NumberElement(151),
250 | StringElement("Mew"),
251 | BooleanElement(true),
252 | NullElement(NSNull()),
253 | ])
254 | expect(self.comparer.include(array, NumberElement(151))).to(beTrue())
255 | expect(self.comparer.include(array, StringElement("Mew"))).to(beTrue())
256 | expect(self.comparer.include(array, BooleanElement(true))).to(beTrue())
257 | expect(self.comparer.include(array, NullElement(NSNull()))).to(beTrue())
258 | expect(self.comparer.include(array, RegexElement("M+".regex))).to(beTrue())
259 | expect(self.comparer.include(array, TypeElement(Type.Number))).to(beTrue())
260 | expect(self.comparer.include(array, TypeElement(Type.Array))).to(beTrue())
261 |
262 | expect(self.comparer.include(array, NumberElement(1))).to(beFalse())
263 | expect(self.comparer.include(array, StringElement("Mewtwo"))).to(beFalse())
264 | expect(self.comparer.include(array, BooleanElement(false))).to(beFalse())
265 | expect(self.comparer.include(array, StringElement("Pikachu"))).to(beFalse())
266 | expect(self.comparer.include(array, RegexElement("P+".regex))).to(beFalse())
267 | expect(self.comparer.include(array, TypeElement(Type.Dictionary))).to(beFalse())
268 | }
269 |
270 | func testIncludeDictionary() {
271 | let dictionary = DictionaryElement([
272 | "number": NumberElement(151),
273 | "string": StringElement("Mew"),
274 | "boolean": BooleanElement(true),
275 | "null": NullElement(NSNull()),
276 | ])
277 | expect(self.comparer.include(dictionary, NumberElement(151))).to(beTrue())
278 | expect(self.comparer.include(dictionary, StringElement("Mew"))).to(beTrue())
279 | expect(self.comparer.include(dictionary, BooleanElement(true))).to(beTrue())
280 | expect(self.comparer.include(dictionary, NullElement(NSNull()))).to(beTrue())
281 | expect(self.comparer.include(dictionary, RegexElement("M+".regex))).to(beTrue())
282 | expect(self.comparer.include(dictionary, TypeElement(Type.Number))).to(beTrue())
283 |
284 | expect(self.comparer.include(dictionary, NumberElement(1))).to(beFalse())
285 | expect(self.comparer.include(dictionary, StringElement("Mewtwo"))).to(beFalse())
286 | expect(self.comparer.include(dictionary, BooleanElement(false))).to(beFalse())
287 | expect(self.comparer.include(dictionary, StringElement("Pikachu"))).to(beFalse())
288 | expect(self.comparer.include(dictionary, RegexElement("P+".regex))).to(beFalse())
289 | expect(self.comparer.include(dictionary, TypeElement(Type.Array))).to(beFalse())
290 | }
291 |
292 | func testIncludeRecursiveArray() {
293 | expect(self.comparer.include(
294 | ArrayElement([StringElement("Articuno"), ArrayElement([
295 | ArrayElement([
296 | ArrayElement([StringElement("Zapdos")]),
297 | StringElement("Moltres")])])]),
298 | StringElement("Zapdos")
299 | )).to(beTrue())
300 | expect(self.comparer.include(
301 | ArrayElement([
302 | StringElement("Articuno"),
303 | ArrayElement([ArrayElement([
304 | ArrayElement([StringElement("Zapdos")]),
305 | StringElement("Moltres")
306 | ])])]),
307 | StringElement("Pikachu")
308 | )).to(beFalse())
309 | }
310 |
311 | func testIncludeRecursiveDictionary() {
312 | expect(self.comparer.include(
313 | DictionaryElement(["moves": DictionaryElement([
314 | "name": StringElement("Swift"),
315 | "type": StringElement("normal")
316 | ])]),
317 | StringElement("Swift")
318 | )).to(beTrue())
319 | expect(self.comparer.include(
320 | DictionaryElement(["moves": DictionaryElement([
321 | "name": StringElement("Swift"),
322 | "type": StringElement("normal")
323 | ])]),
324 | StringElement("Tackle")
325 | )).to(beFalse())
326 | }
327 | }
328 |
--------------------------------------------------------------------------------
/JSONMatcher.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 073742421CE4BFB6002A4A4B /* BeJSONIncluding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 073742411CE4BFB6002A4A4B /* BeJSONIncluding.swift */; };
11 | 077532CF1CEB4C3600E83F6C /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077532CE1CEB4C3600E83F6C /* utils.swift */; };
12 | 07805B271CC3852500101893 /* BeJSONAs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B261CC3852500101893 /* BeJSONAs.swift */; };
13 | 07805B291CC386C900101893 /* Comparer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B281CC386C900101893 /* Comparer.swift */; };
14 | 07805B301CC38E4600101893 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B2F1CC38E4600101893 /* Regex.swift */; };
15 | 079AC7851CF019A200A12B3B /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77B1CF019A200A12B3B /* BaseTestCase.swift */; };
16 | 079AC7861CF019A200A12B3B /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77B1CF019A200A12B3B /* BaseTestCase.swift */; };
17 | 079AC7871CF019A200A12B3B /* BaseTestCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77B1CF019A200A12B3B /* BaseTestCase.swift */; };
18 | 079AC7881CF019A200A12B3B /* BeJSONAsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77C1CF019A200A12B3B /* BeJSONAsTests.swift */; };
19 | 079AC7891CF019A200A12B3B /* BeJSONAsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77C1CF019A200A12B3B /* BeJSONAsTests.swift */; };
20 | 079AC78A1CF019A200A12B3B /* BeJSONAsTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77C1CF019A200A12B3B /* BeJSONAsTests.swift */; };
21 | 079AC78B1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77D1CF019A200A12B3B /* BeJSONIncludingTests.swift */; };
22 | 079AC78C1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77D1CF019A200A12B3B /* BeJSONIncludingTests.swift */; };
23 | 079AC78D1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77D1CF019A200A12B3B /* BeJSONIncludingTests.swift */; };
24 | 079AC78E1CF019A200A12B3B /* BeJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77E1CF019A200A12B3B /* BeJSONTests.swift */; };
25 | 079AC78F1CF019A200A12B3B /* BeJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77E1CF019A200A12B3B /* BeJSONTests.swift */; };
26 | 079AC7901CF019A200A12B3B /* BeJSONTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77E1CF019A200A12B3B /* BeJSONTests.swift */; };
27 | 079AC7911CF019A200A12B3B /* BuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77F1CF019A200A12B3B /* BuilderTests.swift */; };
28 | 079AC7921CF019A200A12B3B /* BuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77F1CF019A200A12B3B /* BuilderTests.swift */; };
29 | 079AC7931CF019A200A12B3B /* BuilderTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC77F1CF019A200A12B3B /* BuilderTests.swift */; };
30 | 079AC7941CF019A200A12B3B /* ComparerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7801CF019A200A12B3B /* ComparerTests.swift */; };
31 | 079AC7951CF019A200A12B3B /* ComparerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7801CF019A200A12B3B /* ComparerTests.swift */; };
32 | 079AC7961CF019A200A12B3B /* ComparerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7801CF019A200A12B3B /* ComparerTests.swift */; };
33 | 079AC7971CF019A200A12B3B /* ElementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7811CF019A200A12B3B /* ElementTests.swift */; };
34 | 079AC7981CF019A200A12B3B /* ElementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7811CF019A200A12B3B /* ElementTests.swift */; };
35 | 079AC7991CF019A200A12B3B /* ElementTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7811CF019A200A12B3B /* ElementTests.swift */; };
36 | 079AC79A1CF019A200A12B3B /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7821CF019A200A12B3B /* ExampleTests.swift */; };
37 | 079AC79B1CF019A200A12B3B /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7821CF019A200A12B3B /* ExampleTests.swift */; };
38 | 079AC79C1CF019A200A12B3B /* ExampleTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7821CF019A200A12B3B /* ExampleTests.swift */; };
39 | 079AC7A01CF019A200A12B3B /* RegexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7841CF019A200A12B3B /* RegexTests.swift */; };
40 | 079AC7A11CF019A200A12B3B /* RegexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7841CF019A200A12B3B /* RegexTests.swift */; };
41 | 079AC7A21CF019A200A12B3B /* RegexTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 079AC7841CF019A200A12B3B /* RegexTests.swift */; };
42 | 079AC7A51CF019AB00A12B3B /* pikachu.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A31CF019AB00A12B3B /* pikachu.json */; };
43 | 079AC7A61CF019AB00A12B3B /* pikachu.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A31CF019AB00A12B3B /* pikachu.json */; };
44 | 079AC7A71CF019AB00A12B3B /* pikachu.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A31CF019AB00A12B3B /* pikachu.json */; };
45 | 079AC7A81CF019AB00A12B3B /* snorlax.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A41CF019AB00A12B3B /* snorlax.json */; };
46 | 079AC7A91CF019AB00A12B3B /* snorlax.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A41CF019AB00A12B3B /* snorlax.json */; };
47 | 079AC7AA1CF019AB00A12B3B /* snorlax.json in Resources */ = {isa = PBXBuildFile; fileRef = 079AC7A41CF019AB00A12B3B /* snorlax.json */; };
48 | 07A1AF531CC357C90033C783 /* JSONMatcher.h in Headers */ = {isa = PBXBuildFile; fileRef = 07A1AF521CC357C90033C783 /* JSONMatcher.h */; settings = {ATTRIBUTES = (Public, ); }; };
49 | 07A1AF5D1CC3580A0033C783 /* JSONMatcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07A1AF471CC3576F0033C783 /* JSONMatcher.framework */; };
50 | 07A1AF721CC35A740033C783 /* BeJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07A1AF711CC35A740033C783 /* BeJSON.swift */; };
51 | 07D2ED7F1CCCDAA6003A5430 /* Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D2ED7E1CCCDAA6003A5430 /* Type.swift */; };
52 | 07FCACF61CEF2D6000FD7D41 /* JSONMatcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCACEC1CEF2D5F00FD7D41 /* JSONMatcher.framework */; };
53 | 07FCAD121CEF2D7800FD7D41 /* JSONMatcher.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD081CEF2D7700FD7D41 /* JSONMatcher.framework */; };
54 | 07FCAD1F1CEF3C0600FD7D41 /* BeJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07A1AF711CC35A740033C783 /* BeJSON.swift */; };
55 | 07FCAD201CEF3C0800FD7D41 /* BeJSONAs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B261CC3852500101893 /* BeJSONAs.swift */; };
56 | 07FCAD211CEF3C0900FD7D41 /* BeJSONIncluding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 073742411CE4BFB6002A4A4B /* BeJSONIncluding.swift */; };
57 | 07FCAD221CEF3C0C00FD7D41 /* Comparer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B281CC386C900101893 /* Comparer.swift */; };
58 | 07FCAD231CEF3C1D00FD7D41 /* Extractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A8CCC1CDA49430050D3E4 /* Extractor.swift */; };
59 | 07FCAD241CEF3C1D00FD7D41 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B2F1CC38E4600101893 /* Regex.swift */; };
60 | 07FCAD251CEF3C1D00FD7D41 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062401CCE1BFE00C174E1 /* Element.swift */; };
61 | 07FCAD261CEF3C1D00FD7D41 /* Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062421CCE1D7B00C174E1 /* Builder.swift */; };
62 | 07FCAD271CEF3C1D00FD7D41 /* Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D2ED7E1CCCDAA6003A5430 /* Type.swift */; };
63 | 07FCAD331CEF3CFE00FD7D41 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077532CE1CEB4C3600E83F6C /* utils.swift */; };
64 | 07FCAD351CEF3D4800FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD341CEF3D4800FD7D41 /* Nimble.framework */; };
65 | 07FCAD361CEF3D6100FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD341CEF3D4800FD7D41 /* Nimble.framework */; };
66 | 07FCAD3A1CEF431400FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD391CEF431400FD7D41 /* Nimble.framework */; };
67 | 07FCAD3B1CEF446A00FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD391CEF431400FD7D41 /* Nimble.framework */; };
68 | 07FCAD3D1CEF482C00FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD3C1CEF482C00FD7D41 /* Nimble.framework */; };
69 | 07FCAD491CEF485800FD7D41 /* BeJSON.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07A1AF711CC35A740033C783 /* BeJSON.swift */; };
70 | 07FCAD4A1CEF485800FD7D41 /* BeJSONAs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B261CC3852500101893 /* BeJSONAs.swift */; };
71 | 07FCAD4B1CEF485800FD7D41 /* BeJSONIncluding.swift in Sources */ = {isa = PBXBuildFile; fileRef = 073742411CE4BFB6002A4A4B /* BeJSONIncluding.swift */; };
72 | 07FCAD4C1CEF485800FD7D41 /* Comparer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B281CC386C900101893 /* Comparer.swift */; };
73 | 07FCAD4D1CEF485800FD7D41 /* Extractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A8CCC1CDA49430050D3E4 /* Extractor.swift */; };
74 | 07FCAD4E1CEF485800FD7D41 /* Regex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07805B2F1CC38E4600101893 /* Regex.swift */; };
75 | 07FCAD4F1CEF485800FD7D41 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062401CCE1BFE00C174E1 /* Element.swift */; };
76 | 07FCAD501CEF485800FD7D41 /* Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062421CCE1D7B00C174E1 /* Builder.swift */; };
77 | 07FCAD511CEF485800FD7D41 /* Type.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07D2ED7E1CCCDAA6003A5430 /* Type.swift */; };
78 | 07FCAD531CEF486200FD7D41 /* Nimble.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 07FCAD521CEF486200FD7D41 /* Nimble.framework */; };
79 | 07FCAD5A1CEF488600FD7D41 /* utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077532CE1CEB4C3600E83F6C /* utils.swift */; };
80 | 540A8CCD1CDA49430050D3E4 /* Extractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 540A8CCC1CDA49430050D3E4 /* Extractor.swift */; };
81 | 54E062411CCE1BFE00C174E1 /* Element.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062401CCE1BFE00C174E1 /* Element.swift */; };
82 | 54E062431CCE1D7B00C174E1 /* Builder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 54E062421CCE1D7B00C174E1 /* Builder.swift */; };
83 | /* End PBXBuildFile section */
84 |
85 | /* Begin PBXContainerItemProxy section */
86 | 07A1AF5E1CC3580A0033C783 /* PBXContainerItemProxy */ = {
87 | isa = PBXContainerItemProxy;
88 | containerPortal = 07A1AF3E1CC3576F0033C783 /* Project object */;
89 | proxyType = 1;
90 | remoteGlobalIDString = 07A1AF461CC3576F0033C783;
91 | remoteInfo = JSONMatcher;
92 | };
93 | 07FCACF71CEF2D6000FD7D41 /* PBXContainerItemProxy */ = {
94 | isa = PBXContainerItemProxy;
95 | containerPortal = 07A1AF3E1CC3576F0033C783 /* Project object */;
96 | proxyType = 1;
97 | remoteGlobalIDString = 07FCACEB1CEF2D5F00FD7D41;
98 | remoteInfo = "JSONMatcher-OSX";
99 | };
100 | 07FCAD131CEF2D7800FD7D41 /* PBXContainerItemProxy */ = {
101 | isa = PBXContainerItemProxy;
102 | containerPortal = 07A1AF3E1CC3576F0033C783 /* Project object */;
103 | proxyType = 1;
104 | remoteGlobalIDString = 07FCAD071CEF2D7700FD7D41;
105 | remoteInfo = "JSONMatcher-tvOS";
106 | };
107 | /* End PBXContainerItemProxy section */
108 |
109 | /* Begin PBXFileReference section */
110 | 073742411CE4BFB6002A4A4B /* BeJSONIncluding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeJSONIncluding.swift; sourceTree = ""; };
111 | 077532CE1CEB4C3600E83F6C /* utils.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = utils.swift; path = ../Carthage/Checkouts/Nimble/Tests/NimbleTests/Helpers/utils.swift; sourceTree = ""; };
112 | 07805B261CC3852500101893 /* BeJSONAs.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeJSONAs.swift; sourceTree = ""; };
113 | 07805B281CC386C900101893 /* Comparer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Comparer.swift; path = Sources/JSONMatcher/Comparer.swift; sourceTree = SOURCE_ROOT; };
114 | 07805B2F1CC38E4600101893 /* Regex.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Regex.swift; path = Sources/JSONMatcher/Regex.swift; sourceTree = SOURCE_ROOT; };
115 | 079AC77B1CF019A200A12B3B /* BaseTestCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BaseTestCase.swift; path = JSONMatcher/BaseTestCase.swift; sourceTree = ""; };
116 | 079AC77C1CF019A200A12B3B /* BeJSONAsTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BeJSONAsTests.swift; path = JSONMatcher/BeJSONAsTests.swift; sourceTree = ""; };
117 | 079AC77D1CF019A200A12B3B /* BeJSONIncludingTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BeJSONIncludingTests.swift; path = JSONMatcher/BeJSONIncludingTests.swift; sourceTree = ""; };
118 | 079AC77E1CF019A200A12B3B /* BeJSONTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BeJSONTests.swift; path = JSONMatcher/BeJSONTests.swift; sourceTree = ""; };
119 | 079AC77F1CF019A200A12B3B /* BuilderTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BuilderTests.swift; path = JSONMatcher/BuilderTests.swift; sourceTree = ""; };
120 | 079AC7801CF019A200A12B3B /* ComparerTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ComparerTests.swift; path = JSONMatcher/ComparerTests.swift; sourceTree = ""; };
121 | 079AC7811CF019A200A12B3B /* ElementTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ElementTests.swift; path = JSONMatcher/ElementTests.swift; sourceTree = ""; };
122 | 079AC7821CF019A200A12B3B /* ExampleTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ExampleTests.swift; path = JSONMatcher/ExampleTests.swift; sourceTree = ""; };
123 | 079AC7831CF019A200A12B3B /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = JSONMatcher/Info.plist; sourceTree = ""; };
124 | 079AC7841CF019A200A12B3B /* RegexTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = RegexTests.swift; path = JSONMatcher/RegexTests.swift; sourceTree = ""; };
125 | 079AC7A31CF019AB00A12B3B /* pikachu.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = pikachu.json; path = JSONMatcher/fixtures/pikachu.json; sourceTree = ""; };
126 | 079AC7A41CF019AB00A12B3B /* snorlax.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; name = snorlax.json; path = JSONMatcher/fixtures/snorlax.json; sourceTree = ""; };
127 | 07A1AF471CC3576F0033C783 /* JSONMatcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONMatcher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
128 | 07A1AF521CC357C90033C783 /* JSONMatcher.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = JSONMatcher.h; path = Sources/JSONMatcher/JSONMatcher.h; sourceTree = SOURCE_ROOT; };
129 | 07A1AF581CC3580A0033C783 /* JSONMatcher-iOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "JSONMatcher-iOSTests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
130 | 07A1AF681CC3583A0033C783 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = Info.plist; path = Sources/JSONMatcher/Info.plist; sourceTree = SOURCE_ROOT; };
131 | 07A1AF711CC35A740033C783 /* BeJSON.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BeJSON.swift; sourceTree = ""; };
132 | 07D2ED7E1CCCDAA6003A5430 /* Type.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Type.swift; path = Sources/JSONMatcher/Type.swift; sourceTree = SOURCE_ROOT; };
133 | 07FCACEC1CEF2D5F00FD7D41 /* JSONMatcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONMatcher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
134 | 07FCACF51CEF2D6000FD7D41 /* JSONMatcherOSXTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JSONMatcherOSXTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
135 | 07FCAD081CEF2D7700FD7D41 /* JSONMatcher.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSONMatcher.framework; sourceTree = BUILT_PRODUCTS_DIR; };
136 | 07FCAD111CEF2D7700FD7D41 /* JSONMatchertvOSTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = JSONMatchertvOSTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
137 | 07FCAD341CEF3D4800FD7D41 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/iOS/Nimble.framework; sourceTree = ""; };
138 | 07FCAD391CEF431400FD7D41 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = Carthage/Build/Mac/Nimble.framework; sourceTree = ""; };
139 | 07FCAD3C1CEF482C00FD7D41 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "../../Develop/Debug-appletvos/Nimble.framework"; sourceTree = ""; };
140 | 07FCAD521CEF486200FD7D41 /* Nimble.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Nimble.framework; path = "../../Develop/Debug-appletvos/Nimble.framework"; sourceTree = ""; };
141 | 540A8CCC1CDA49430050D3E4 /* Extractor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Extractor.swift; path = Sources/JSONMatcher/Extractor.swift; sourceTree = SOURCE_ROOT; };
142 | 54E062401CCE1BFE00C174E1 /* Element.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Element.swift; path = Sources/JSONMatcher/Element.swift; sourceTree = SOURCE_ROOT; };
143 | 54E062421CCE1D7B00C174E1 /* Builder.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Builder.swift; path = Sources/JSONMatcher/Builder.swift; sourceTree = SOURCE_ROOT; };
144 | /* End PBXFileReference section */
145 |
146 | /* Begin PBXFrameworksBuildPhase section */
147 | 07A1AF431CC3576F0033C783 /* Frameworks */ = {
148 | isa = PBXFrameworksBuildPhase;
149 | buildActionMask = 2147483647;
150 | files = (
151 | 07FCAD351CEF3D4800FD7D41 /* Nimble.framework in Frameworks */,
152 | );
153 | runOnlyForDeploymentPostprocessing = 0;
154 | };
155 | 07A1AF551CC3580A0033C783 /* Frameworks */ = {
156 | isa = PBXFrameworksBuildPhase;
157 | buildActionMask = 2147483647;
158 | files = (
159 | 07FCAD361CEF3D6100FD7D41 /* Nimble.framework in Frameworks */,
160 | 07A1AF5D1CC3580A0033C783 /* JSONMatcher.framework in Frameworks */,
161 | );
162 | runOnlyForDeploymentPostprocessing = 0;
163 | };
164 | 07FCACE81CEF2D5F00FD7D41 /* Frameworks */ = {
165 | isa = PBXFrameworksBuildPhase;
166 | buildActionMask = 2147483647;
167 | files = (
168 | 07FCAD3B1CEF446A00FD7D41 /* Nimble.framework in Frameworks */,
169 | );
170 | runOnlyForDeploymentPostprocessing = 0;
171 | };
172 | 07FCACF21CEF2D6000FD7D41 /* Frameworks */ = {
173 | isa = PBXFrameworksBuildPhase;
174 | buildActionMask = 2147483647;
175 | files = (
176 | 07FCAD3A1CEF431400FD7D41 /* Nimble.framework in Frameworks */,
177 | 07FCACF61CEF2D6000FD7D41 /* JSONMatcher.framework in Frameworks */,
178 | );
179 | runOnlyForDeploymentPostprocessing = 0;
180 | };
181 | 07FCAD041CEF2D7700FD7D41 /* Frameworks */ = {
182 | isa = PBXFrameworksBuildPhase;
183 | buildActionMask = 2147483647;
184 | files = (
185 | 07FCAD3D1CEF482C00FD7D41 /* Nimble.framework in Frameworks */,
186 | );
187 | runOnlyForDeploymentPostprocessing = 0;
188 | };
189 | 07FCAD0E1CEF2D7700FD7D41 /* Frameworks */ = {
190 | isa = PBXFrameworksBuildPhase;
191 | buildActionMask = 2147483647;
192 | files = (
193 | 07FCAD531CEF486200FD7D41 /* Nimble.framework in Frameworks */,
194 | 07FCAD121CEF2D7800FD7D41 /* JSONMatcher.framework in Frameworks */,
195 | );
196 | runOnlyForDeploymentPostprocessing = 0;
197 | };
198 | /* End PBXFrameworksBuildPhase section */
199 |
200 | /* Begin PBXGroup section */
201 | 07805B2E1CC38AC500101893 /* fixtures */ = {
202 | isa = PBXGroup;
203 | children = (
204 | 079AC7A31CF019AB00A12B3B /* pikachu.json */,
205 | 079AC7A41CF019AB00A12B3B /* snorlax.json */,
206 | );
207 | name = fixtures;
208 | sourceTree = "";
209 | };
210 | 07A1AF3D1CC3576F0033C783 = {
211 | isa = PBXGroup;
212 | children = (
213 | 07FCAD5C1CEF4C5000FD7D41 /* Frameworks */,
214 | 07A1AF491CC3576F0033C783 /* JSONMatcher */,
215 | 07A1AF631CC3582E0033C783 /* Tests */,
216 | 07A1AF481CC3576F0033C783 /* Products */,
217 | );
218 | sourceTree = "";
219 | };
220 | 07A1AF481CC3576F0033C783 /* Products */ = {
221 | isa = PBXGroup;
222 | children = (
223 | 07A1AF471CC3576F0033C783 /* JSONMatcher.framework */,
224 | 07A1AF581CC3580A0033C783 /* JSONMatcher-iOSTests.xctest */,
225 | 07FCACEC1CEF2D5F00FD7D41 /* JSONMatcher.framework */,
226 | 07FCACF51CEF2D6000FD7D41 /* JSONMatcherOSXTests.xctest */,
227 | 07FCAD081CEF2D7700FD7D41 /* JSONMatcher.framework */,
228 | 07FCAD111CEF2D7700FD7D41 /* JSONMatchertvOSTests.xctest */,
229 | );
230 | name = Products;
231 | sourceTree = "";
232 | };
233 | 07A1AF491CC3576F0033C783 /* JSONMatcher */ = {
234 | isa = PBXGroup;
235 | children = (
236 | 07A1AF681CC3583A0033C783 /* Info.plist */,
237 | 07A1AF521CC357C90033C783 /* JSONMatcher.h */,
238 | 07A1AF701CC35A740033C783 /* Matcher */,
239 | 07805B281CC386C900101893 /* Comparer.swift */,
240 | 540A8CCC1CDA49430050D3E4 /* Extractor.swift */,
241 | 07805B2F1CC38E4600101893 /* Regex.swift */,
242 | 54E062401CCE1BFE00C174E1 /* Element.swift */,
243 | 54E062421CCE1D7B00C174E1 /* Builder.swift */,
244 | 07D2ED7E1CCCDAA6003A5430 /* Type.swift */,
245 | );
246 | path = JSONMatcher;
247 | sourceTree = "";
248 | };
249 | 07A1AF631CC3582E0033C783 /* Tests */ = {
250 | isa = PBXGroup;
251 | children = (
252 | 07805B2E1CC38AC500101893 /* fixtures */,
253 | 077532CE1CEB4C3600E83F6C /* utils.swift */,
254 | 079AC77B1CF019A200A12B3B /* BaseTestCase.swift */,
255 | 079AC77C1CF019A200A12B3B /* BeJSONAsTests.swift */,
256 | 079AC77D1CF019A200A12B3B /* BeJSONIncludingTests.swift */,
257 | 079AC77E1CF019A200A12B3B /* BeJSONTests.swift */,
258 | 079AC77F1CF019A200A12B3B /* BuilderTests.swift */,
259 | 079AC7801CF019A200A12B3B /* ComparerTests.swift */,
260 | 079AC7811CF019A200A12B3B /* ElementTests.swift */,
261 | 079AC7821CF019A200A12B3B /* ExampleTests.swift */,
262 | 079AC7831CF019A200A12B3B /* Info.plist */,
263 | 079AC7841CF019A200A12B3B /* RegexTests.swift */,
264 | );
265 | path = Tests;
266 | sourceTree = "";
267 | };
268 | 07A1AF701CC35A740033C783 /* Matcher */ = {
269 | isa = PBXGroup;
270 | children = (
271 | 07A1AF711CC35A740033C783 /* BeJSON.swift */,
272 | 07805B261CC3852500101893 /* BeJSONAs.swift */,
273 | 073742411CE4BFB6002A4A4B /* BeJSONIncluding.swift */,
274 | );
275 | name = Matcher;
276 | path = Sources/JSONMatcher/Matcher;
277 | sourceTree = SOURCE_ROOT;
278 | };
279 | 07FCAD5C1CEF4C5000FD7D41 /* Frameworks */ = {
280 | isa = PBXGroup;
281 | children = (
282 | 07FCAD521CEF486200FD7D41 /* Nimble.framework */,
283 | 07FCAD3C1CEF482C00FD7D41 /* Nimble.framework */,
284 | 07FCAD391CEF431400FD7D41 /* Nimble.framework */,
285 | 07FCAD341CEF3D4800FD7D41 /* Nimble.framework */,
286 | );
287 | name = Frameworks;
288 | sourceTree = "";
289 | };
290 | /* End PBXGroup section */
291 |
292 | /* Begin PBXHeadersBuildPhase section */
293 | 07A1AF441CC3576F0033C783 /* Headers */ = {
294 | isa = PBXHeadersBuildPhase;
295 | buildActionMask = 2147483647;
296 | files = (
297 | 07A1AF531CC357C90033C783 /* JSONMatcher.h in Headers */,
298 | );
299 | runOnlyForDeploymentPostprocessing = 0;
300 | };
301 | 07FCACE91CEF2D5F00FD7D41 /* Headers */ = {
302 | isa = PBXHeadersBuildPhase;
303 | buildActionMask = 2147483647;
304 | files = (
305 | );
306 | runOnlyForDeploymentPostprocessing = 0;
307 | };
308 | 07FCAD051CEF2D7700FD7D41 /* Headers */ = {
309 | isa = PBXHeadersBuildPhase;
310 | buildActionMask = 2147483647;
311 | files = (
312 | );
313 | runOnlyForDeploymentPostprocessing = 0;
314 | };
315 | /* End PBXHeadersBuildPhase section */
316 |
317 | /* Begin PBXNativeTarget section */
318 | 07A1AF461CC3576F0033C783 /* JSONMatcher-iOS */ = {
319 | isa = PBXNativeTarget;
320 | buildConfigurationList = 07A1AF4F1CC3576F0033C783 /* Build configuration list for PBXNativeTarget "JSONMatcher-iOS" */;
321 | buildPhases = (
322 | 07A1AF421CC3576F0033C783 /* Sources */,
323 | 07A1AF431CC3576F0033C783 /* Frameworks */,
324 | 07A1AF441CC3576F0033C783 /* Headers */,
325 | 07A1AF451CC3576F0033C783 /* Resources */,
326 | );
327 | buildRules = (
328 | );
329 | dependencies = (
330 | );
331 | name = "JSONMatcher-iOS";
332 | productName = JSONMatcher;
333 | productReference = 07A1AF471CC3576F0033C783 /* JSONMatcher.framework */;
334 | productType = "com.apple.product-type.framework";
335 | };
336 | 07A1AF571CC3580A0033C783 /* JSONMatcher-iOSTests */ = {
337 | isa = PBXNativeTarget;
338 | buildConfigurationList = 07A1AF601CC3580A0033C783 /* Build configuration list for PBXNativeTarget "JSONMatcher-iOSTests" */;
339 | buildPhases = (
340 | 07A1AF541CC3580A0033C783 /* Sources */,
341 | 07A1AF551CC3580A0033C783 /* Frameworks */,
342 | 07A1AF561CC3580A0033C783 /* Resources */,
343 | );
344 | buildRules = (
345 | );
346 | dependencies = (
347 | 07A1AF5F1CC3580A0033C783 /* PBXTargetDependency */,
348 | );
349 | name = "JSONMatcher-iOSTests";
350 | productName = JSONMatcherTests;
351 | productReference = 07A1AF581CC3580A0033C783 /* JSONMatcher-iOSTests.xctest */;
352 | productType = "com.apple.product-type.bundle.unit-test";
353 | };
354 | 07FCACEB1CEF2D5F00FD7D41 /* JSONMatcher-OSX */ = {
355 | isa = PBXNativeTarget;
356 | buildConfigurationList = 07FCAD011CEF2D6000FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-OSX" */;
357 | buildPhases = (
358 | 07FCACE71CEF2D5F00FD7D41 /* Sources */,
359 | 07FCACE81CEF2D5F00FD7D41 /* Frameworks */,
360 | 07FCACE91CEF2D5F00FD7D41 /* Headers */,
361 | 07FCACEA1CEF2D5F00FD7D41 /* Resources */,
362 | );
363 | buildRules = (
364 | );
365 | dependencies = (
366 | );
367 | name = "JSONMatcher-OSX";
368 | productName = "JSONMatcher-OSX";
369 | productReference = 07FCACEC1CEF2D5F00FD7D41 /* JSONMatcher.framework */;
370 | productType = "com.apple.product-type.framework";
371 | };
372 | 07FCACF41CEF2D6000FD7D41 /* JSONMatcher-OSXTests */ = {
373 | isa = PBXNativeTarget;
374 | buildConfigurationList = 07FCAD021CEF2D6000FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-OSXTests" */;
375 | buildPhases = (
376 | 07FCACF11CEF2D6000FD7D41 /* Sources */,
377 | 07FCACF21CEF2D6000FD7D41 /* Frameworks */,
378 | 07FCACF31CEF2D6000FD7D41 /* Resources */,
379 | );
380 | buildRules = (
381 | );
382 | dependencies = (
383 | 07FCACF81CEF2D6000FD7D41 /* PBXTargetDependency */,
384 | );
385 | name = "JSONMatcher-OSXTests";
386 | productName = "JSONMatcher-OSXTests";
387 | productReference = 07FCACF51CEF2D6000FD7D41 /* JSONMatcherOSXTests.xctest */;
388 | productType = "com.apple.product-type.bundle.unit-test";
389 | };
390 | 07FCAD071CEF2D7700FD7D41 /* JSONMatcher-tvOS */ = {
391 | isa = PBXNativeTarget;
392 | buildConfigurationList = 07FCAD191CEF2D7800FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-tvOS" */;
393 | buildPhases = (
394 | 07FCAD031CEF2D7700FD7D41 /* Sources */,
395 | 07FCAD041CEF2D7700FD7D41 /* Frameworks */,
396 | 07FCAD051CEF2D7700FD7D41 /* Headers */,
397 | 07FCAD061CEF2D7700FD7D41 /* Resources */,
398 | );
399 | buildRules = (
400 | );
401 | dependencies = (
402 | );
403 | name = "JSONMatcher-tvOS";
404 | productName = "JSONMatcher-tvOS";
405 | productReference = 07FCAD081CEF2D7700FD7D41 /* JSONMatcher.framework */;
406 | productType = "com.apple.product-type.framework";
407 | };
408 | 07FCAD101CEF2D7700FD7D41 /* JSONMatcher-tvOSTests */ = {
409 | isa = PBXNativeTarget;
410 | buildConfigurationList = 07FCAD1C1CEF2D7800FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-tvOSTests" */;
411 | buildPhases = (
412 | 07FCAD0D1CEF2D7700FD7D41 /* Sources */,
413 | 07FCAD0E1CEF2D7700FD7D41 /* Frameworks */,
414 | 07FCAD0F1CEF2D7700FD7D41 /* Resources */,
415 | );
416 | buildRules = (
417 | );
418 | dependencies = (
419 | 07FCAD141CEF2D7800FD7D41 /* PBXTargetDependency */,
420 | );
421 | name = "JSONMatcher-tvOSTests";
422 | productName = "JSONMatcher-tvOSTests";
423 | productReference = 07FCAD111CEF2D7700FD7D41 /* JSONMatchertvOSTests.xctest */;
424 | productType = "com.apple.product-type.bundle.unit-test";
425 | };
426 | /* End PBXNativeTarget section */
427 |
428 | /* Begin PBXProject section */
429 | 07A1AF3E1CC3576F0033C783 /* Project object */ = {
430 | isa = PBXProject;
431 | attributes = {
432 | LastSwiftUpdateCheck = 0730;
433 | LastUpgradeCheck = 0730;
434 | ORGANIZATIONNAME = giginet;
435 | TargetAttributes = {
436 | 07A1AF461CC3576F0033C783 = {
437 | CreatedOnToolsVersion = 7.3;
438 | LastSwiftMigration = 0830;
439 | };
440 | 07A1AF571CC3580A0033C783 = {
441 | CreatedOnToolsVersion = 7.3;
442 | LastSwiftMigration = 0830;
443 | };
444 | 07FCACEB1CEF2D5F00FD7D41 = {
445 | CreatedOnToolsVersion = 7.3.1;
446 | LastSwiftMigration = 0830;
447 | };
448 | 07FCACF41CEF2D6000FD7D41 = {
449 | CreatedOnToolsVersion = 7.3.1;
450 | LastSwiftMigration = 0830;
451 | };
452 | 07FCAD071CEF2D7700FD7D41 = {
453 | CreatedOnToolsVersion = 7.3.1;
454 | LastSwiftMigration = 0830;
455 | };
456 | 07FCAD101CEF2D7700FD7D41 = {
457 | CreatedOnToolsVersion = 7.3.1;
458 | LastSwiftMigration = 0830;
459 | };
460 | };
461 | };
462 | buildConfigurationList = 07A1AF411CC3576F0033C783 /* Build configuration list for PBXProject "JSONMatcher" */;
463 | compatibilityVersion = "Xcode 3.2";
464 | developmentRegion = English;
465 | hasScannedForEncodings = 0;
466 | knownRegions = (
467 | en,
468 | );
469 | mainGroup = 07A1AF3D1CC3576F0033C783;
470 | productRefGroup = 07A1AF481CC3576F0033C783 /* Products */;
471 | projectDirPath = "";
472 | projectRoot = "";
473 | targets = (
474 | 07A1AF461CC3576F0033C783 /* JSONMatcher-iOS */,
475 | 07A1AF571CC3580A0033C783 /* JSONMatcher-iOSTests */,
476 | 07FCACEB1CEF2D5F00FD7D41 /* JSONMatcher-OSX */,
477 | 07FCACF41CEF2D6000FD7D41 /* JSONMatcher-OSXTests */,
478 | 07FCAD071CEF2D7700FD7D41 /* JSONMatcher-tvOS */,
479 | 07FCAD101CEF2D7700FD7D41 /* JSONMatcher-tvOSTests */,
480 | );
481 | };
482 | /* End PBXProject section */
483 |
484 | /* Begin PBXResourcesBuildPhase section */
485 | 07A1AF451CC3576F0033C783 /* Resources */ = {
486 | isa = PBXResourcesBuildPhase;
487 | buildActionMask = 2147483647;
488 | files = (
489 | );
490 | runOnlyForDeploymentPostprocessing = 0;
491 | };
492 | 07A1AF561CC3580A0033C783 /* Resources */ = {
493 | isa = PBXResourcesBuildPhase;
494 | buildActionMask = 2147483647;
495 | files = (
496 | 079AC7A81CF019AB00A12B3B /* snorlax.json in Resources */,
497 | 079AC7A51CF019AB00A12B3B /* pikachu.json in Resources */,
498 | );
499 | runOnlyForDeploymentPostprocessing = 0;
500 | };
501 | 07FCACEA1CEF2D5F00FD7D41 /* Resources */ = {
502 | isa = PBXResourcesBuildPhase;
503 | buildActionMask = 2147483647;
504 | files = (
505 | );
506 | runOnlyForDeploymentPostprocessing = 0;
507 | };
508 | 07FCACF31CEF2D6000FD7D41 /* Resources */ = {
509 | isa = PBXResourcesBuildPhase;
510 | buildActionMask = 2147483647;
511 | files = (
512 | 079AC7A91CF019AB00A12B3B /* snorlax.json in Resources */,
513 | 079AC7A61CF019AB00A12B3B /* pikachu.json in Resources */,
514 | );
515 | runOnlyForDeploymentPostprocessing = 0;
516 | };
517 | 07FCAD061CEF2D7700FD7D41 /* Resources */ = {
518 | isa = PBXResourcesBuildPhase;
519 | buildActionMask = 2147483647;
520 | files = (
521 | );
522 | runOnlyForDeploymentPostprocessing = 0;
523 | };
524 | 07FCAD0F1CEF2D7700FD7D41 /* Resources */ = {
525 | isa = PBXResourcesBuildPhase;
526 | buildActionMask = 2147483647;
527 | files = (
528 | 079AC7AA1CF019AB00A12B3B /* snorlax.json in Resources */,
529 | 079AC7A71CF019AB00A12B3B /* pikachu.json in Resources */,
530 | );
531 | runOnlyForDeploymentPostprocessing = 0;
532 | };
533 | /* End PBXResourcesBuildPhase section */
534 |
535 | /* Begin PBXSourcesBuildPhase section */
536 | 07A1AF421CC3576F0033C783 /* Sources */ = {
537 | isa = PBXSourcesBuildPhase;
538 | buildActionMask = 2147483647;
539 | files = (
540 | 07805B271CC3852500101893 /* BeJSONAs.swift in Sources */,
541 | 540A8CCD1CDA49430050D3E4 /* Extractor.swift in Sources */,
542 | 54E062411CCE1BFE00C174E1 /* Element.swift in Sources */,
543 | 07A1AF721CC35A740033C783 /* BeJSON.swift in Sources */,
544 | 073742421CE4BFB6002A4A4B /* BeJSONIncluding.swift in Sources */,
545 | 07805B291CC386C900101893 /* Comparer.swift in Sources */,
546 | 07805B301CC38E4600101893 /* Regex.swift in Sources */,
547 | 07D2ED7F1CCCDAA6003A5430 /* Type.swift in Sources */,
548 | 54E062431CCE1D7B00C174E1 /* Builder.swift in Sources */,
549 | );
550 | runOnlyForDeploymentPostprocessing = 0;
551 | };
552 | 07A1AF541CC3580A0033C783 /* Sources */ = {
553 | isa = PBXSourcesBuildPhase;
554 | buildActionMask = 2147483647;
555 | files = (
556 | 079AC7881CF019A200A12B3B /* BeJSONAsTests.swift in Sources */,
557 | 079AC7911CF019A200A12B3B /* BuilderTests.swift in Sources */,
558 | 079AC7971CF019A200A12B3B /* ElementTests.swift in Sources */,
559 | 079AC7851CF019A200A12B3B /* BaseTestCase.swift in Sources */,
560 | 079AC78B1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */,
561 | 079AC7941CF019A200A12B3B /* ComparerTests.swift in Sources */,
562 | 079AC78E1CF019A200A12B3B /* BeJSONTests.swift in Sources */,
563 | 077532CF1CEB4C3600E83F6C /* utils.swift in Sources */,
564 | 079AC79A1CF019A200A12B3B /* ExampleTests.swift in Sources */,
565 | 079AC7A01CF019A200A12B3B /* RegexTests.swift in Sources */,
566 | );
567 | runOnlyForDeploymentPostprocessing = 0;
568 | };
569 | 07FCACE71CEF2D5F00FD7D41 /* Sources */ = {
570 | isa = PBXSourcesBuildPhase;
571 | buildActionMask = 2147483647;
572 | files = (
573 | 07FCAD1F1CEF3C0600FD7D41 /* BeJSON.swift in Sources */,
574 | 07FCAD201CEF3C0800FD7D41 /* BeJSONAs.swift in Sources */,
575 | 07FCAD211CEF3C0900FD7D41 /* BeJSONIncluding.swift in Sources */,
576 | 07FCAD221CEF3C0C00FD7D41 /* Comparer.swift in Sources */,
577 | 07FCAD231CEF3C1D00FD7D41 /* Extractor.swift in Sources */,
578 | 07FCAD241CEF3C1D00FD7D41 /* Regex.swift in Sources */,
579 | 07FCAD251CEF3C1D00FD7D41 /* Element.swift in Sources */,
580 | 07FCAD261CEF3C1D00FD7D41 /* Builder.swift in Sources */,
581 | 07FCAD271CEF3C1D00FD7D41 /* Type.swift in Sources */,
582 | );
583 | runOnlyForDeploymentPostprocessing = 0;
584 | };
585 | 07FCACF11CEF2D6000FD7D41 /* Sources */ = {
586 | isa = PBXSourcesBuildPhase;
587 | buildActionMask = 2147483647;
588 | files = (
589 | 079AC7891CF019A200A12B3B /* BeJSONAsTests.swift in Sources */,
590 | 079AC7921CF019A200A12B3B /* BuilderTests.swift in Sources */,
591 | 079AC7981CF019A200A12B3B /* ElementTests.swift in Sources */,
592 | 079AC7861CF019A200A12B3B /* BaseTestCase.swift in Sources */,
593 | 079AC78C1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */,
594 | 079AC7951CF019A200A12B3B /* ComparerTests.swift in Sources */,
595 | 079AC78F1CF019A200A12B3B /* BeJSONTests.swift in Sources */,
596 | 07FCAD331CEF3CFE00FD7D41 /* utils.swift in Sources */,
597 | 079AC79B1CF019A200A12B3B /* ExampleTests.swift in Sources */,
598 | 079AC7A11CF019A200A12B3B /* RegexTests.swift in Sources */,
599 | );
600 | runOnlyForDeploymentPostprocessing = 0;
601 | };
602 | 07FCAD031CEF2D7700FD7D41 /* Sources */ = {
603 | isa = PBXSourcesBuildPhase;
604 | buildActionMask = 2147483647;
605 | files = (
606 | 07FCAD491CEF485800FD7D41 /* BeJSON.swift in Sources */,
607 | 07FCAD4A1CEF485800FD7D41 /* BeJSONAs.swift in Sources */,
608 | 07FCAD4B1CEF485800FD7D41 /* BeJSONIncluding.swift in Sources */,
609 | 07FCAD4C1CEF485800FD7D41 /* Comparer.swift in Sources */,
610 | 07FCAD4D1CEF485800FD7D41 /* Extractor.swift in Sources */,
611 | 07FCAD4E1CEF485800FD7D41 /* Regex.swift in Sources */,
612 | 07FCAD4F1CEF485800FD7D41 /* Element.swift in Sources */,
613 | 07FCAD501CEF485800FD7D41 /* Builder.swift in Sources */,
614 | 07FCAD511CEF485800FD7D41 /* Type.swift in Sources */,
615 | );
616 | runOnlyForDeploymentPostprocessing = 0;
617 | };
618 | 07FCAD0D1CEF2D7700FD7D41 /* Sources */ = {
619 | isa = PBXSourcesBuildPhase;
620 | buildActionMask = 2147483647;
621 | files = (
622 | 079AC78A1CF019A200A12B3B /* BeJSONAsTests.swift in Sources */,
623 | 079AC7931CF019A200A12B3B /* BuilderTests.swift in Sources */,
624 | 079AC7991CF019A200A12B3B /* ElementTests.swift in Sources */,
625 | 079AC7871CF019A200A12B3B /* BaseTestCase.swift in Sources */,
626 | 079AC78D1CF019A200A12B3B /* BeJSONIncludingTests.swift in Sources */,
627 | 079AC7961CF019A200A12B3B /* ComparerTests.swift in Sources */,
628 | 079AC7901CF019A200A12B3B /* BeJSONTests.swift in Sources */,
629 | 07FCAD5A1CEF488600FD7D41 /* utils.swift in Sources */,
630 | 079AC79C1CF019A200A12B3B /* ExampleTests.swift in Sources */,
631 | 079AC7A21CF019A200A12B3B /* RegexTests.swift in Sources */,
632 | );
633 | runOnlyForDeploymentPostprocessing = 0;
634 | };
635 | /* End PBXSourcesBuildPhase section */
636 |
637 | /* Begin PBXTargetDependency section */
638 | 07A1AF5F1CC3580A0033C783 /* PBXTargetDependency */ = {
639 | isa = PBXTargetDependency;
640 | target = 07A1AF461CC3576F0033C783 /* JSONMatcher-iOS */;
641 | targetProxy = 07A1AF5E1CC3580A0033C783 /* PBXContainerItemProxy */;
642 | };
643 | 07FCACF81CEF2D6000FD7D41 /* PBXTargetDependency */ = {
644 | isa = PBXTargetDependency;
645 | target = 07FCACEB1CEF2D5F00FD7D41 /* JSONMatcher-OSX */;
646 | targetProxy = 07FCACF71CEF2D6000FD7D41 /* PBXContainerItemProxy */;
647 | };
648 | 07FCAD141CEF2D7800FD7D41 /* PBXTargetDependency */ = {
649 | isa = PBXTargetDependency;
650 | target = 07FCAD071CEF2D7700FD7D41 /* JSONMatcher-tvOS */;
651 | targetProxy = 07FCAD131CEF2D7800FD7D41 /* PBXContainerItemProxy */;
652 | };
653 | /* End PBXTargetDependency section */
654 |
655 | /* Begin XCBuildConfiguration section */
656 | 07A1AF4D1CC3576F0033C783 /* Debug */ = {
657 | isa = XCBuildConfiguration;
658 | buildSettings = {
659 | ALWAYS_SEARCH_USER_PATHS = NO;
660 | CLANG_ANALYZER_NONNULL = YES;
661 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
662 | CLANG_CXX_LIBRARY = "libc++";
663 | CLANG_ENABLE_MODULES = YES;
664 | CLANG_ENABLE_OBJC_ARC = YES;
665 | CLANG_WARN_BOOL_CONVERSION = YES;
666 | CLANG_WARN_CONSTANT_CONVERSION = YES;
667 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
668 | CLANG_WARN_EMPTY_BODY = YES;
669 | CLANG_WARN_ENUM_CONVERSION = YES;
670 | CLANG_WARN_INT_CONVERSION = YES;
671 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
672 | CLANG_WARN_UNREACHABLE_CODE = YES;
673 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
674 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
675 | COPY_PHASE_STRIP = NO;
676 | CURRENT_PROJECT_VERSION = 1;
677 | DEBUG_INFORMATION_FORMAT = dwarf;
678 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
679 | ENABLE_STRICT_OBJC_MSGSEND = YES;
680 | ENABLE_TESTABILITY = YES;
681 | GCC_C_LANGUAGE_STANDARD = gnu99;
682 | GCC_DYNAMIC_NO_PIC = NO;
683 | GCC_NO_COMMON_BLOCKS = YES;
684 | GCC_OPTIMIZATION_LEVEL = 0;
685 | GCC_PREPROCESSOR_DEFINITIONS = (
686 | "DEBUG=1",
687 | "$(inherited)",
688 | );
689 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
690 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
691 | GCC_WARN_UNDECLARED_SELECTOR = YES;
692 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
693 | GCC_WARN_UNUSED_FUNCTION = YES;
694 | GCC_WARN_UNUSED_VARIABLE = YES;
695 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
696 | MTL_ENABLE_DEBUG_INFO = YES;
697 | ONLY_ACTIVE_ARCH = YES;
698 | SDKROOT = iphoneos;
699 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
700 | TARGETED_DEVICE_FAMILY = "1,2";
701 | VERSIONING_SYSTEM = "apple-generic";
702 | VERSION_INFO_PREFIX = "";
703 | };
704 | name = Debug;
705 | };
706 | 07A1AF4E1CC3576F0033C783 /* Release */ = {
707 | isa = XCBuildConfiguration;
708 | buildSettings = {
709 | ALWAYS_SEARCH_USER_PATHS = NO;
710 | CLANG_ANALYZER_NONNULL = YES;
711 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
712 | CLANG_CXX_LIBRARY = "libc++";
713 | CLANG_ENABLE_MODULES = YES;
714 | CLANG_ENABLE_OBJC_ARC = YES;
715 | CLANG_WARN_BOOL_CONVERSION = YES;
716 | CLANG_WARN_CONSTANT_CONVERSION = YES;
717 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
718 | CLANG_WARN_EMPTY_BODY = YES;
719 | CLANG_WARN_ENUM_CONVERSION = YES;
720 | CLANG_WARN_INT_CONVERSION = YES;
721 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
722 | CLANG_WARN_UNREACHABLE_CODE = YES;
723 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
724 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
725 | COPY_PHASE_STRIP = NO;
726 | CURRENT_PROJECT_VERSION = 1;
727 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
728 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
729 | ENABLE_NS_ASSERTIONS = NO;
730 | ENABLE_STRICT_OBJC_MSGSEND = YES;
731 | GCC_C_LANGUAGE_STANDARD = gnu99;
732 | GCC_NO_COMMON_BLOCKS = YES;
733 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
734 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
735 | GCC_WARN_UNDECLARED_SELECTOR = YES;
736 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
737 | GCC_WARN_UNUSED_FUNCTION = YES;
738 | GCC_WARN_UNUSED_VARIABLE = YES;
739 | IPHONEOS_DEPLOYMENT_TARGET = 9.3;
740 | MTL_ENABLE_DEBUG_INFO = NO;
741 | SDKROOT = iphoneos;
742 | TARGETED_DEVICE_FAMILY = "1,2";
743 | VALIDATE_PRODUCT = YES;
744 | VERSIONING_SYSTEM = "apple-generic";
745 | VERSION_INFO_PREFIX = "";
746 | };
747 | name = Release;
748 | };
749 | 07A1AF501CC3576F0033C783 /* Debug */ = {
750 | isa = XCBuildConfiguration;
751 | buildSettings = {
752 | CLANG_ENABLE_MODULES = YES;
753 | DEFINES_MODULE = YES;
754 | DYLIB_COMPATIBILITY_VERSION = 1;
755 | DYLIB_CURRENT_VERSION = 1;
756 | DYLIB_INSTALL_NAME_BASE = "@rpath";
757 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
758 | ENABLE_BITCODE = NO;
759 | FRAMEWORK_SEARCH_PATHS = (
760 | "$(inherited)",
761 | "$(PROJECT_DIR)/Carthage/Build/iOS",
762 | "$(PLATFORM_DIR)/Developer/Library/Frameworks",
763 | );
764 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
765 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
766 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
767 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
768 | ONLY_ACTIVE_ARCH = YES;
769 | OTHER_LDFLAGS = (
770 | "-weak_framework",
771 | XCTest,
772 | "-weak-lswiftXCTest",
773 | );
774 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
775 | PRODUCT_NAME = JSONMatcher;
776 | SKIP_INSTALL = YES;
777 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
778 | SWIFT_VERSION = 3.0;
779 | };
780 | name = Debug;
781 | };
782 | 07A1AF511CC3576F0033C783 /* Release */ = {
783 | isa = XCBuildConfiguration;
784 | buildSettings = {
785 | CLANG_ENABLE_MODULES = YES;
786 | DEFINES_MODULE = YES;
787 | DYLIB_COMPATIBILITY_VERSION = 1;
788 | DYLIB_CURRENT_VERSION = 1;
789 | DYLIB_INSTALL_NAME_BASE = "@rpath";
790 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
791 | ENABLE_BITCODE = NO;
792 | FRAMEWORK_SEARCH_PATHS = (
793 | "$(inherited)",
794 | "$(PROJECT_DIR)/Carthage/Build/iOS",
795 | "$(PLATFORM_DIR)/Developer/Library/Frameworks",
796 | );
797 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
798 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
799 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
800 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
801 | ONLY_ACTIVE_ARCH = NO;
802 | OTHER_LDFLAGS = (
803 | "-weak_framework",
804 | XCTest,
805 | "-weak-lswiftXCTest",
806 | );
807 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
808 | PRODUCT_NAME = JSONMatcher;
809 | SKIP_INSTALL = YES;
810 | SWIFT_VERSION = 3.0;
811 | };
812 | name = Release;
813 | };
814 | 07A1AF611CC3580A0033C783 /* Debug */ = {
815 | isa = XCBuildConfiguration;
816 | buildSettings = {
817 | CLANG_ENABLE_MODULES = YES;
818 | FRAMEWORK_SEARCH_PATHS = (
819 | "$(inherited)",
820 | "$(PROJECT_DIR)/Carthage/Build/iOS",
821 | );
822 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
823 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
824 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
825 | PRODUCT_NAME = "$(TARGET_NAME)";
826 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
827 | SWIFT_VERSION = 3.0;
828 | };
829 | name = Debug;
830 | };
831 | 07A1AF621CC3580A0033C783 /* Release */ = {
832 | isa = XCBuildConfiguration;
833 | buildSettings = {
834 | CLANG_ENABLE_MODULES = YES;
835 | FRAMEWORK_SEARCH_PATHS = (
836 | "$(inherited)",
837 | "$(PROJECT_DIR)/Carthage/Build/iOS",
838 | );
839 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
840 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
841 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
842 | PRODUCT_NAME = "$(TARGET_NAME)";
843 | SWIFT_VERSION = 3.0;
844 | };
845 | name = Release;
846 | };
847 | 07FCACFD1CEF2D6000FD7D41 /* Debug */ = {
848 | isa = XCBuildConfiguration;
849 | buildSettings = {
850 | CODE_SIGN_IDENTITY = "-";
851 | COMBINE_HIDPI_IMAGES = YES;
852 | DEFINES_MODULE = YES;
853 | DYLIB_COMPATIBILITY_VERSION = 1;
854 | DYLIB_CURRENT_VERSION = 1;
855 | DYLIB_INSTALL_NAME_BASE = "@rpath";
856 | FRAMEWORK_SEARCH_PATHS = (
857 | "$(inherited)",
858 | "$(PROJECT_DIR)/Carthage/Build/Mac",
859 | "$(PLATFORM_DIR)/Developer/Library/Frameworks",
860 | );
861 | FRAMEWORK_VERSION = A;
862 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
863 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
864 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
865 | MACOSX_DEPLOYMENT_TARGET = 10.10;
866 | OTHER_LDFLAGS = (
867 | "-weak_framework",
868 | XCTest,
869 | "-weak-lswiftXCTest",
870 | );
871 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
872 | PRODUCT_NAME = JSONMatcher;
873 | SDKROOT = macosx;
874 | SKIP_INSTALL = YES;
875 | SWIFT_VERSION = 3.0;
876 | };
877 | name = Debug;
878 | };
879 | 07FCACFE1CEF2D6000FD7D41 /* Release */ = {
880 | isa = XCBuildConfiguration;
881 | buildSettings = {
882 | CODE_SIGN_IDENTITY = "-";
883 | COMBINE_HIDPI_IMAGES = YES;
884 | DEFINES_MODULE = YES;
885 | DYLIB_COMPATIBILITY_VERSION = 1;
886 | DYLIB_CURRENT_VERSION = 1;
887 | DYLIB_INSTALL_NAME_BASE = "@rpath";
888 | FRAMEWORK_SEARCH_PATHS = (
889 | "$(inherited)",
890 | "$(PROJECT_DIR)/Carthage/Build/Mac",
891 | "$(PLATFORM_DIR)/Developer/Library/Frameworks",
892 | );
893 | FRAMEWORK_VERSION = A;
894 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
895 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
896 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
897 | MACOSX_DEPLOYMENT_TARGET = 10.10;
898 | OTHER_LDFLAGS = (
899 | "-weak_framework",
900 | XCTest,
901 | "-weak-lswiftXCTest",
902 | );
903 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
904 | PRODUCT_NAME = JSONMatcher;
905 | SDKROOT = macosx;
906 | SKIP_INSTALL = YES;
907 | SWIFT_VERSION = 3.0;
908 | };
909 | name = Release;
910 | };
911 | 07FCACFF1CEF2D6000FD7D41 /* Debug */ = {
912 | isa = XCBuildConfiguration;
913 | buildSettings = {
914 | CODE_SIGN_IDENTITY = "-";
915 | COMBINE_HIDPI_IMAGES = YES;
916 | FRAMEWORK_SEARCH_PATHS = (
917 | "$(inherited)",
918 | "$(PROJECT_DIR)/Carthage/Build/Mac",
919 | );
920 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
921 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
922 | MACOSX_DEPLOYMENT_TARGET = 10.11;
923 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
924 | PRODUCT_NAME = JSONMatcherOSXTests;
925 | SDKROOT = macosx;
926 | SWIFT_VERSION = 3.0;
927 | };
928 | name = Debug;
929 | };
930 | 07FCAD001CEF2D6000FD7D41 /* Release */ = {
931 | isa = XCBuildConfiguration;
932 | buildSettings = {
933 | CODE_SIGN_IDENTITY = "-";
934 | COMBINE_HIDPI_IMAGES = YES;
935 | FRAMEWORK_SEARCH_PATHS = (
936 | "$(inherited)",
937 | "$(PROJECT_DIR)/Carthage/Build/Mac",
938 | );
939 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
940 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/../Frameworks @loader_path/../Frameworks";
941 | MACOSX_DEPLOYMENT_TARGET = 10.11;
942 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
943 | PRODUCT_NAME = JSONMatcherOSXTests;
944 | SDKROOT = macosx;
945 | SWIFT_VERSION = 3.0;
946 | };
947 | name = Release;
948 | };
949 | 07FCAD1A1CEF2D7800FD7D41 /* Debug */ = {
950 | isa = XCBuildConfiguration;
951 | buildSettings = {
952 | DEFINES_MODULE = YES;
953 | DYLIB_COMPATIBILITY_VERSION = 1;
954 | DYLIB_CURRENT_VERSION = 1;
955 | DYLIB_INSTALL_NAME_BASE = "@rpath";
956 | FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
957 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
958 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
959 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
960 | OTHER_LDFLAGS = (
961 | "-weak_framework",
962 | XCTest,
963 | "-weak-lswiftXCTest",
964 | );
965 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
966 | PRODUCT_NAME = JSONMatcher;
967 | SDKROOT = appletvos;
968 | SKIP_INSTALL = YES;
969 | SWIFT_VERSION = 3.0;
970 | TARGETED_DEVICE_FAMILY = 3;
971 | TVOS_DEPLOYMENT_TARGET = 9.0;
972 | };
973 | name = Debug;
974 | };
975 | 07FCAD1B1CEF2D7800FD7D41 /* Release */ = {
976 | isa = XCBuildConfiguration;
977 | buildSettings = {
978 | DEFINES_MODULE = YES;
979 | DYLIB_COMPATIBILITY_VERSION = 1;
980 | DYLIB_CURRENT_VERSION = 1;
981 | DYLIB_INSTALL_NAME_BASE = "@rpath";
982 | FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
983 | INFOPLIST_FILE = Sources/JSONMatcher/Info.plist;
984 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
985 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
986 | OTHER_LDFLAGS = (
987 | "-weak_framework",
988 | XCTest,
989 | "-weak-lswiftXCTest",
990 | );
991 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcher;
992 | PRODUCT_NAME = JSONMatcher;
993 | SDKROOT = appletvos;
994 | SKIP_INSTALL = YES;
995 | SWIFT_VERSION = 3.0;
996 | TARGETED_DEVICE_FAMILY = 3;
997 | TVOS_DEPLOYMENT_TARGET = 9.0;
998 | };
999 | name = Release;
1000 | };
1001 | 07FCAD1D1CEF2D7800FD7D41 /* Debug */ = {
1002 | isa = XCBuildConfiguration;
1003 | buildSettings = {
1004 | FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
1005 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
1006 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1007 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
1008 | PRODUCT_NAME = JSONMatchertvOSTests;
1009 | SDKROOT = appletvos;
1010 | SWIFT_VERSION = 3.0;
1011 | TVOS_DEPLOYMENT_TARGET = 9.2;
1012 | };
1013 | name = Debug;
1014 | };
1015 | 07FCAD1E1CEF2D7800FD7D41 /* Release */ = {
1016 | isa = XCBuildConfiguration;
1017 | buildSettings = {
1018 | FRAMEWORK_SEARCH_PATHS = "$(PLATFORM_DIR)/Developer/Library/Frameworks";
1019 | INFOPLIST_FILE = Tests/JSONMatcher/Info.plist;
1020 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
1021 | PRODUCT_BUNDLE_IDENTIFIER = org.giginet.JSONMatcherTests;
1022 | PRODUCT_NAME = JSONMatchertvOSTests;
1023 | SDKROOT = appletvos;
1024 | SWIFT_VERSION = 3.0;
1025 | TVOS_DEPLOYMENT_TARGET = 9.2;
1026 | };
1027 | name = Release;
1028 | };
1029 | /* End XCBuildConfiguration section */
1030 |
1031 | /* Begin XCConfigurationList section */
1032 | 07A1AF411CC3576F0033C783 /* Build configuration list for PBXProject "JSONMatcher" */ = {
1033 | isa = XCConfigurationList;
1034 | buildConfigurations = (
1035 | 07A1AF4D1CC3576F0033C783 /* Debug */,
1036 | 07A1AF4E1CC3576F0033C783 /* Release */,
1037 | );
1038 | defaultConfigurationIsVisible = 0;
1039 | defaultConfigurationName = Release;
1040 | };
1041 | 07A1AF4F1CC3576F0033C783 /* Build configuration list for PBXNativeTarget "JSONMatcher-iOS" */ = {
1042 | isa = XCConfigurationList;
1043 | buildConfigurations = (
1044 | 07A1AF501CC3576F0033C783 /* Debug */,
1045 | 07A1AF511CC3576F0033C783 /* Release */,
1046 | );
1047 | defaultConfigurationIsVisible = 0;
1048 | defaultConfigurationName = Release;
1049 | };
1050 | 07A1AF601CC3580A0033C783 /* Build configuration list for PBXNativeTarget "JSONMatcher-iOSTests" */ = {
1051 | isa = XCConfigurationList;
1052 | buildConfigurations = (
1053 | 07A1AF611CC3580A0033C783 /* Debug */,
1054 | 07A1AF621CC3580A0033C783 /* Release */,
1055 | );
1056 | defaultConfigurationIsVisible = 0;
1057 | defaultConfigurationName = Release;
1058 | };
1059 | 07FCAD011CEF2D6000FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-OSX" */ = {
1060 | isa = XCConfigurationList;
1061 | buildConfigurations = (
1062 | 07FCACFD1CEF2D6000FD7D41 /* Debug */,
1063 | 07FCACFE1CEF2D6000FD7D41 /* Release */,
1064 | );
1065 | defaultConfigurationIsVisible = 0;
1066 | defaultConfigurationName = Release;
1067 | };
1068 | 07FCAD021CEF2D6000FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-OSXTests" */ = {
1069 | isa = XCConfigurationList;
1070 | buildConfigurations = (
1071 | 07FCACFF1CEF2D6000FD7D41 /* Debug */,
1072 | 07FCAD001CEF2D6000FD7D41 /* Release */,
1073 | );
1074 | defaultConfigurationIsVisible = 0;
1075 | defaultConfigurationName = Release;
1076 | };
1077 | 07FCAD191CEF2D7800FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-tvOS" */ = {
1078 | isa = XCConfigurationList;
1079 | buildConfigurations = (
1080 | 07FCAD1A1CEF2D7800FD7D41 /* Debug */,
1081 | 07FCAD1B1CEF2D7800FD7D41 /* Release */,
1082 | );
1083 | defaultConfigurationIsVisible = 0;
1084 | defaultConfigurationName = Release;
1085 | };
1086 | 07FCAD1C1CEF2D7800FD7D41 /* Build configuration list for PBXNativeTarget "JSONMatcher-tvOSTests" */ = {
1087 | isa = XCConfigurationList;
1088 | buildConfigurations = (
1089 | 07FCAD1D1CEF2D7800FD7D41 /* Debug */,
1090 | 07FCAD1E1CEF2D7800FD7D41 /* Release */,
1091 | );
1092 | defaultConfigurationIsVisible = 0;
1093 | defaultConfigurationName = Release;
1094 | };
1095 | /* End XCConfigurationList section */
1096 | };
1097 | rootObject = 07A1AF3E1CC3576F0033C783 /* Project object */;
1098 | }
1099 |
--------------------------------------------------------------------------------