├── .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 | [![Build Status](https://travis-ci.org/giginet/JSONMatcher.svg?branch=master)](https://travis-ci.org/giginet/JSONMatcher) 5 | [![codecov](https://codecov.io/gh/giginet/JSONMatcher/branch/master/graph/badge.svg)](https://codecov.io/gh/giginet/JSONMatcher) 6 | [![CocoaPods Compatible](https://img.shields.io/cocoapods/v/JSONMatcher.svg)](https://img.shields.io/cocoapods/v/JSONMatcher.svg) 7 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 8 | [![Swift Package Manager](https://img.shields.io/badge/Swift%20Package%20Manager-compatible-brightgreen.svg)](https://github.com/apple/swift-package-manager) 9 | [![Platform](https://img.shields.io/cocoapods/p/JSONMatcher.svg?style=flat)](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 | --------------------------------------------------------------------------------