FMResultSetTests.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. //
  2. // FMResultSetTests.m
  3. // fmdb
  4. //
  5. // Created by Muralidharan,Roshan on 10/6/14.
  6. //
  7. //
  8. #import "FMDBTempDBTests.h"
  9. #import "FMDatabase.h"
  10. #if FMDB_SQLITE_STANDALONE
  11. #import <sqlite3/sqlite3.h>
  12. #else
  13. #import <sqlite3.h>
  14. #endif
  15. @interface FMResultSetTests : FMDBTempDBTests
  16. @end
  17. @implementation FMResultSetTests
  18. + (void)populateDatabase:(FMDatabase *)db
  19. {
  20. [db executeUpdate:@"create table test (a text, b text, c integer, d double, e double)"];
  21. [db beginTransaction];
  22. int i = 0;
  23. while (i++ < 20) {
  24. [db executeUpdate:@"insert into test (a, b, c, d, e) values (?, ?, ?, ?, ?)" ,
  25. @"hi'",
  26. [NSString stringWithFormat:@"number %d", i],
  27. [NSNumber numberWithInt:i],
  28. [NSDate date],
  29. [NSNumber numberWithFloat:2.2f]];
  30. }
  31. [db commit];
  32. }
  33. - (void)testNextWithError_WithoutError
  34. {
  35. [self.db executeUpdate:@"CREATE TABLE testTable(key INTEGER PRIMARY KEY, value INTEGER)"];
  36. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (1, 2)"];
  37. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (2, 4)"];
  38. FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM testTable WHERE key=1"];
  39. XCTAssertNotNil(resultSet);
  40. NSError *error;
  41. XCTAssertTrue([resultSet nextWithError:&error]);
  42. XCTAssertNil(error);
  43. XCTAssertFalse([resultSet nextWithError:&error]);
  44. XCTAssertNil(error);
  45. [resultSet close];
  46. }
  47. - (void)testNextWithError_WithBusyError
  48. {
  49. [self.db executeUpdate:@"CREATE TABLE testTable(key INTEGER PRIMARY KEY, value INTEGER)"];
  50. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (1, 2)"];
  51. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (2, 4)"];
  52. FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM testTable WHERE key=1"];
  53. XCTAssertNotNil(resultSet);
  54. FMDatabase *newDB = [FMDatabase databaseWithPath:self.databasePath];
  55. [newDB open];
  56. [newDB beginExclusiveTransaction];
  57. NSError *error;
  58. XCTAssertFalse([resultSet nextWithError:&error]);
  59. [newDB commit];
  60. XCTAssertEqual(error.code, SQLITE_BUSY, @"SQLITE_BUSY should be the last error");
  61. [resultSet close];
  62. }
  63. - (void)testNextWithError_WithMisuseError
  64. {
  65. [self.db executeUpdate:@"CREATE TABLE testTable(key INTEGER PRIMARY KEY, value INTEGER)"];
  66. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (1, 2)"];
  67. [self.db executeUpdate:@"INSERT INTO testTable (key, value) VALUES (2, 4)"];
  68. FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM testTable WHERE key=9"];
  69. XCTAssertNotNil(resultSet);
  70. XCTAssertFalse([resultSet next]);
  71. NSError *error;
  72. XCTAssertFalse([resultSet nextWithError:&error]);
  73. XCTAssertEqual(error.code, SQLITE_MISUSE, @"SQLITE_MISUSE should be the last error");
  74. }
  75. - (void)testColumnTypes
  76. {
  77. [self.db executeUpdate:@"CREATE TABLE testTable (intValue INTEGER, floatValue FLOAT, textValue TEXT, blobValue BLOB)"];
  78. NSString *sql = @"INSERT INTO testTable (intValue, floatValue, textValue, blobValue) VALUES (?, ?, ?, ?)";
  79. NSError *error;
  80. NSData *data = [@"foo" dataUsingEncoding:NSUTF8StringEncoding];
  81. NSData *zeroLengthData = [NSData data];
  82. NSNull *null = [NSNull null];
  83. [self.db executeUpdate:sql values:@[@42, @M_PI, @"test", data] error:&error];
  84. [self.db executeUpdate:sql values:@[null, null, null, null] error:&error];
  85. [self.db executeUpdate:sql values:@[null, null, null, zeroLengthData] error:&error];
  86. FMResultSet *resultSet = [self.db executeQuery:@"SELECT * FROM testTable"];
  87. XCTAssertNotNil(resultSet);
  88. XCTAssertTrue([resultSet next]);
  89. XCTAssertEqual([resultSet typeForColumn:@"intValue"], SqliteValueTypeInteger);
  90. XCTAssertEqual([resultSet typeForColumn:@"floatValue"], SqliteValueTypeFloat);
  91. XCTAssertEqual([resultSet typeForColumn:@"textValue"], SqliteValueTypeText);
  92. XCTAssertEqual([resultSet typeForColumn:@"blobValue"], SqliteValueTypeBlob);
  93. XCTAssertNotNil([resultSet dataForColumn:@"blobValue"]);
  94. XCTAssertTrue([resultSet next]);
  95. XCTAssertEqual([resultSet typeForColumn:@"intValue"], SqliteValueTypeNull);
  96. XCTAssertEqual([resultSet typeForColumn:@"floatValue"], SqliteValueTypeNull);
  97. XCTAssertEqual([resultSet typeForColumn:@"textValue"], SqliteValueTypeNull);
  98. XCTAssertEqual([resultSet typeForColumn:@"blobValue"], SqliteValueTypeNull);
  99. XCTAssertNil([resultSet dataForColumn:@"blobValue"]);
  100. XCTAssertTrue([resultSet next]);
  101. XCTAssertEqual([resultSet typeForColumn:@"blobValue"], SqliteValueTypeBlob);
  102. XCTAssertNil([resultSet dataForColumn:@"blobValue"]);
  103. [resultSet close];
  104. }
  105. @end