mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-02 05:48:38 +09:00
208 lines
8.1 KiB
Swift
208 lines
8.1 KiB
Swift
import XCTest
|
|
import SQLite
|
|
|
|
class FTS4Tests : XCTestCase {
|
|
|
|
func test_create_onVirtualTable_withFTS4_compilesCreateVirtualTableExpression() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()",
|
|
virtualTable.create(.FTS4())
|
|
)
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")",
|
|
virtualTable.create(.FTS4(string))
|
|
)
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)",
|
|
virtualTable.create(.FTS4(tokenize: .Simple))
|
|
)
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", tokenize=porter)",
|
|
virtualTable.create(.FTS4([string], tokenize: .Porter))
|
|
)
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=0\")",
|
|
virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: false)))
|
|
)
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")",
|
|
virtualTable.create(.FTS4(tokenize: .Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"])))
|
|
)
|
|
}
|
|
|
|
func test_match_onVirtualTableAsExpression_compilesMatchExpression() {
|
|
AssertSQL("(\"virtual_table\" MATCH 'string')", virtualTable.match("string") as Expression<Bool>)
|
|
AssertSQL("(\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as Expression<Bool>)
|
|
AssertSQL("(\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as Expression<Bool?>)
|
|
}
|
|
|
|
func test_match_onVirtualTableAsQueryType_compilesMatchExpression() {
|
|
AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH 'string')", virtualTable.match("string") as QueryType)
|
|
AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"string\")", virtualTable.match(string) as QueryType)
|
|
AssertSQL("SELECT * FROM \"virtual_table\" WHERE (\"virtual_table\" MATCH \"stringOptional\")", virtualTable.match(stringOptional) as QueryType)
|
|
}
|
|
|
|
}
|
|
|
|
class FTS4ConfigTests : XCTestCase {
|
|
var config: FTS4Config!
|
|
|
|
override func setUp() {
|
|
super.setUp()
|
|
config = FTS4Config()
|
|
}
|
|
|
|
func test_empty_config() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4()",
|
|
sql(config))
|
|
}
|
|
|
|
func test_config_column() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\")",
|
|
sql(config.column(string)))
|
|
}
|
|
|
|
func test_config_columns() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", \"int\")",
|
|
sql(config.columns([string, int])))
|
|
}
|
|
|
|
func test_config_unindexed_column() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"string\", notindexed=\"string\")",
|
|
sql(config.column(string, [.unindexed])))
|
|
}
|
|
|
|
func test_external_content_view() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"view\")",
|
|
sql(config.externalContent(_view )))
|
|
}
|
|
|
|
func test_external_content_virtual_table() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"virtual_table\")",
|
|
sql(config.externalContent(virtualTable)))
|
|
}
|
|
|
|
func test_tokenizer_simple() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=simple)",
|
|
sql(config.tokenizer(.Simple)))
|
|
}
|
|
|
|
func test_tokenizer_porter() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=porter)",
|
|
sql(config.tokenizer(.Porter)))
|
|
}
|
|
|
|
func test_tokenizer_unicode61() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61)",
|
|
sql(config.tokenizer(.Unicode61())))
|
|
}
|
|
|
|
func test_tokenizer_unicode61_with_options() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(tokenize=unicode61 \"removeDiacritics=1\" \"tokenchars=.\" \"separators=X\")",
|
|
sql(config.tokenizer(.Unicode61(removeDiacritics: true, tokenchars: ["."], separators: ["X"]))))
|
|
}
|
|
|
|
func test_content_less() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(content=\"\")",
|
|
sql(config.contentless()))
|
|
}
|
|
|
|
func test_config_matchinfo() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(matchinfo=\"fts3\")",
|
|
sql(config.matchInfo(.fts3)))
|
|
}
|
|
|
|
func test_config_order_asc() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"asc\")",
|
|
sql(config.order(.asc)))
|
|
}
|
|
|
|
func test_config_order_desc() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(order=\"desc\")",
|
|
sql(config.order(.desc)))
|
|
}
|
|
|
|
func test_config_compress() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(compress=\"compress_foo\")",
|
|
sql(config.compress("compress_foo")))
|
|
}
|
|
|
|
func test_config_uncompress() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(uncompress=\"uncompress_foo\")",
|
|
sql(config.uncompress("uncompress_foo")))
|
|
}
|
|
|
|
func test_config_languageId() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(languageid=\"lid\")",
|
|
sql(config.languageId("lid")))
|
|
}
|
|
|
|
func test_config_all() {
|
|
XCTAssertEqual(
|
|
"CREATE VIRTUAL TABLE \"virtual_table\" USING fts4(\"int\", \"string\", \"date\", tokenize=porter, prefix=\"2,4\", content=\"table\", notindexed=\"string\", notindexed=\"date\", languageid=\"lid\", matchinfo=\"fts3\", order=\"desc\")",
|
|
sql(config
|
|
.tokenizer(.Porter)
|
|
.column(int)
|
|
.column(string, [.unindexed])
|
|
.column(date, [.unindexed])
|
|
.externalContent(table)
|
|
.matchInfo(.fts3)
|
|
.languageId("lid")
|
|
.order(.desc)
|
|
.prefix([2, 4]))
|
|
)
|
|
}
|
|
|
|
func sql(_ config: FTS4Config) -> String {
|
|
return virtualTable.create(.FTS4(config))
|
|
}
|
|
}
|
|
|
|
class FTS4IntegrationTests : SQLiteTestCase {
|
|
#if !SQLITE_SWIFT_STANDALONE && !SQLITE_SWIFT_SQLCIPHER
|
|
func test_registerTokenizer_registersTokenizer() {
|
|
let emails = VirtualTable("emails")
|
|
let subject = Expression<String?>("subject")
|
|
let body = Expression<String?>("body")
|
|
|
|
let locale = CFLocaleCopyCurrent()
|
|
let tokenizerName = "tokenizer"
|
|
let tokenizer = CFStringTokenizerCreate(nil, "" as CFString!, CFRangeMake(0, 0), UInt(kCFStringTokenizerUnitWord), locale)
|
|
try! db.registerTokenizer(tokenizerName) { string in
|
|
CFStringTokenizerSetString(tokenizer, string as CFString, CFRangeMake(0, CFStringGetLength(string as CFString)))
|
|
if CFStringTokenizerAdvanceToNextToken(tokenizer).isEmpty {
|
|
return nil
|
|
}
|
|
let range = CFStringTokenizerGetCurrentTokenRange(tokenizer)
|
|
let input = CFStringCreateWithSubstring(kCFAllocatorDefault, string as CFString, range)!
|
|
let token = CFStringCreateMutableCopy(nil, range.length, input)!
|
|
CFStringLowercase(token, locale)
|
|
CFStringTransform(token, nil, kCFStringTransformStripDiacritics, false)
|
|
return (token as String, string.range(of: input as String)!)
|
|
}
|
|
|
|
try! db.run(emails.create(.FTS4([subject, body], tokenize: .Custom(tokenizerName))))
|
|
AssertSQL("CREATE VIRTUAL TABLE \"emails\" USING fts4(\"subject\", \"body\", tokenize=\"SQLite.swift\" \"tokenizer\")")
|
|
|
|
try! _ = db.run(emails.insert(subject <- "Aún más cáfe!"))
|
|
XCTAssertEqual(1, try! db.scalar(emails.filter(emails.match("aun")).count))
|
|
}
|
|
#endif
|
|
}
|