// // QueryTests.swift // CoreStore // // Copyright © 2016 John Rommel Estropia // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. // import XCTest @testable import CoreStore // MARK: - QueryTests class QueryTests: BaseTestDataTestCase { @objc dynamic func test_ThatDataStacks_CanQueryAttributeValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("testEntityID", isEqualTo: 101) ] do { let value = stack.queryValue( from, Select("testBoolean"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, true) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testNumber"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 1) } do { let value = stack.queryValue( from, Select("testDecimal"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, NSDecimalNumber(string: "1")) } do { let value = stack.queryValue( from, Select("testString"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:1") } do { let value = stack.queryValue( from, Select("testString"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:1") } do { let value = stack.queryValue( from, Select("testData"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Data?, "nil:TestEntity1:1".data(using: .utf8)) } do { let value = stack.queryValue( from, Select("testDate"), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-01T00:00:00Z")) } do { let value = stack.queryValue( from, Select("testDate"), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryAverageValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1), OrderBy(.ascending("testEntityID")) ] do { let value = stack.queryValue( from, Select(.average("testBoolean")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, true) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3.5) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3.5) } do { let value = stack.queryValue( from, Select(.average("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 3.5) } do { let value = stack.queryValue( from, Select(.average("testDecimal")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, NSDecimalNumber(string: "3.5")) } do { let value = stack.queryValue( from, Select(.average("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.average("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.average("testData")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.average("testDate")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select("testEntityID"), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryCountValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1) ] do { let value = stack.queryValue( from, Select(.count("testBoolean")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, true) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 4) } do { let value = stack.queryValue( from, Select(.count("testDecimal")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.count("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.count("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.count("testData")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.count("testDate")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.count("testEntityID")), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryMaximumValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1) ] do { let value = stack.queryValue( from, Select(.maximum("testBoolean")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, true) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 5) } do { let value = stack.queryValue( from, Select(.maximum("testDecimal")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, NSDecimalNumber(string: "5")) } do { let value = stack.queryValue( from, Select(.maximum("testString")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:5") } do { let value = stack.queryValue( from, Select(.maximum("testString")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:5") } do { let value = stack.queryValue( from, Select(.maximum("testData")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Data?, "nil:TestEntity1:5".data(using: .utf8)) } do { let value = stack.queryValue( from, Select(.maximum("testDate")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-05T00:00:00Z")) } do { let value = stack.queryValue( from, Select(.maximum("testEntityID")), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryMinimumValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1) ] do { let value = stack.queryValue( from, Select(.minimum("testBoolean")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, false) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 2) } do { let value = stack.queryValue( from, Select(.minimum("testDecimal")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, NSDecimalNumber(string: "2")) } do { let value = stack.queryValue( from, Select(.minimum("testString")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:2") } do { let value = stack.queryValue( from, Select(.minimum("testString")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, "nil:TestEntity1:2") } do { let value = stack.queryValue( from, Select(.minimum("testData")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Data?, "nil:TestEntity1:2".data(using: .utf8)) } do { let value = stack.queryValue( from, Select(.minimum("testDate")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value as Date?, self.dateFormatter.date(from: "2000-01-02T00:00:00Z")) } do { let value = stack.queryValue( from, Select(.minimum("testEntityID")), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQuerySumValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1) ] do { let value = stack.queryValue( from, Select(.sum("testBoolean")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, true) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testNumber")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, 14) } do { let value = stack.queryValue( from, Select(.sum("testDecimal")), queryClauses ) XCTAssertNotNil(value) XCTAssertEqual(value, NSDecimalNumber(string: "14")) } do { let value = stack.queryValue( from, Select(.sum("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.sum("testString")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.sum("testData")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.sum("testDate")), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.sum("testEntityID")), queryClauses ) XCTAssertNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryObjectIDValue() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 1) ] do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNil(value) } do { let value = stack.queryValue( from, Select(.objectID()), queryClauses ) XCTAssertNotNil(value) } } } @objc dynamic func test_ThatDataStacks_CanQueryAttributes() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [ Where("%K > %@", "testNumber", 3), OrderBy(.ascending("testEntityID")) ] do { let values: [NSDictionary]? = stack.queryAttributes( from, Select( "testBoolean", "testNumber", "testDecimal", "testString", "testData", "testDate", "testNil" ), queryClauses ) XCTAssertNotNil(values) XCTAssertEqual( values!, [ [ "testBoolean": NSNumber(value: false), "testNumber": NSNumber(value: 4), "testDecimal": NSDecimalNumber(string: "4"), "testString": "nil:TestEntity1:4", "testData": ("nil:TestEntity1:4" as NSString).data(using: String.Encoding.utf8.rawValue)!, "testDate": self.dateFormatter.date(from: "2000-01-04T00:00:00Z")! ], [ "testBoolean": NSNumber(value: true), "testNumber": NSNumber(value: 5), "testDecimal": NSDecimalNumber(string: "5"), "testString": "nil:TestEntity1:5", "testData": ("nil:TestEntity1:5" as NSString).data(using: String.Encoding.utf8.rawValue)!, "testDate": self.dateFormatter.date(from: "2000-01-05T00:00:00Z")! ] ] as [NSDictionary] ) } } } @objc dynamic func test_ThatDataStacks_CanQueryAggregates() { let configurations: [String?] = [nil] self.prepareStack(configurations: configurations) { (stack) in self.prepareTestDataForStack(stack, configurations: configurations) let from = From(configurations) let queryClauses: [QueryClause] = [] do { let values: [NSDictionary]? = stack.queryAttributes( from, Select( .sum("testBoolean"), .count("testNumber"), .maximum("testNumber"), .minimum("testNumber"), .average("testDecimal") ), queryClauses ) XCTAssertNotNil(values) XCTAssertEqual( values!, [ [ "sum(testBoolean)": 3, "count(testNumber)": 5, "max(testNumber)": 5, "min(testNumber)": 1, "average(testDecimal)": 3, ] ] as [NSDictionary] ) } do { let values: [NSDictionary]? = stack.queryAttributes( from, Select( .sum("testBoolean", as: "testSum"), .count("testNumber", as: "testCount"), .maximum("testNumber", as: "testMaximum"), .minimum("testNumber", as: "testMinimum"), .average("testDecimal", as: "testAverage") ), queryClauses ) XCTAssertNotNil(values) XCTAssertEqual( values!, [ [ "testSum": 3, "testCount": 5, "testMaximum": 5, "testMinimum": 1, "testAverage": 3, ] ] as [NSDictionary] ) } } } }