mirror of https://github.com/oxen-io/session-ios
Merge branch 'mkirk/text-caption-size'
commit
76b9564b83
@ -0,0 +1,100 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
class StringAdditionsTest: XCTestCase {
|
||||||
|
|
||||||
|
override func setUp() {
|
||||||
|
super.setUp()
|
||||||
|
// Put setup code here. This method is called before the invocation of each test method in the class.
|
||||||
|
}
|
||||||
|
|
||||||
|
override func tearDown() {
|
||||||
|
// Put teardown code here. This method is called after the invocation of each test method in the class.
|
||||||
|
super.tearDown()
|
||||||
|
}
|
||||||
|
|
||||||
|
func testASCII() {
|
||||||
|
let originalString = "Hello World"
|
||||||
|
|
||||||
|
var truncatedString = originalString.truncated(toByteCount: 8)
|
||||||
|
XCTAssertEqual("Hello Wo", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 0)
|
||||||
|
XCTAssertEqual("", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 11)
|
||||||
|
XCTAssertEqual("Hello World", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 12)
|
||||||
|
XCTAssertEqual("Hello World", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 100)
|
||||||
|
XCTAssertEqual("Hello World", truncatedString)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMultiByte() {
|
||||||
|
let originalString = "🇨🇦🇨🇦🇨🇦🇨🇦"
|
||||||
|
|
||||||
|
var truncatedString = originalString.truncated(toByteCount: 0)
|
||||||
|
XCTAssertEqual("", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 1)
|
||||||
|
XCTAssertEqual("", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 7)
|
||||||
|
XCTAssertEqual("", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 8)
|
||||||
|
XCTAssertEqual("🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 9)
|
||||||
|
XCTAssertEqual("🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 15)
|
||||||
|
XCTAssertEqual("🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 16)
|
||||||
|
XCTAssertEqual("🇨🇦🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 17)
|
||||||
|
XCTAssertEqual("🇨🇦🇨🇦", truncatedString)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testMixed() {
|
||||||
|
let originalString = "Oh🇨🇦Canada🇨🇦"
|
||||||
|
|
||||||
|
var truncatedString = originalString.truncated(toByteCount: 0)
|
||||||
|
XCTAssertEqual("", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 1)
|
||||||
|
XCTAssertEqual("O", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 7)
|
||||||
|
XCTAssertEqual("Oh", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 9)
|
||||||
|
XCTAssertEqual("Oh", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 10)
|
||||||
|
XCTAssertEqual("Oh🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 11)
|
||||||
|
XCTAssertEqual("Oh🇨🇦C", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 23)
|
||||||
|
XCTAssertEqual("Oh🇨🇦Canada", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 24)
|
||||||
|
XCTAssertEqual("Oh🇨🇦Canada🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 25)
|
||||||
|
XCTAssertEqual("Oh🇨🇦Canada🇨🇦", truncatedString)
|
||||||
|
|
||||||
|
truncatedString = originalString.truncated(toByteCount: 100)
|
||||||
|
XCTAssertEqual("Oh🇨🇦Canada🇨🇦", truncatedString)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,49 @@
|
|||||||
|
//
|
||||||
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public extension String {
|
||||||
|
|
||||||
|
// Truncates string to be less than or equal to byteCount, while ensuring we never truncate partial characters for multibyte characters.
|
||||||
|
public func truncated(toByteCount byteCount: UInt) -> String? {
|
||||||
|
var lowerBoundCharCount = 0
|
||||||
|
var upperBoundCharCount = self.count
|
||||||
|
|
||||||
|
while (lowerBoundCharCount < upperBoundCharCount) {
|
||||||
|
guard let upperBoundData = self.prefix(upperBoundCharCount).data(using: .utf8) else {
|
||||||
|
owsFail("in \(#function) upperBoundData was unexpectedly nil")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if upperBoundData.count <= byteCount {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
// converge
|
||||||
|
if upperBoundCharCount - lowerBoundCharCount == 1 {
|
||||||
|
upperBoundCharCount = lowerBoundCharCount
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
let midpointCharCount = (lowerBoundCharCount + upperBoundCharCount) / 2
|
||||||
|
let midpointString = self.prefix(midpointCharCount)
|
||||||
|
|
||||||
|
guard let midpointData = midpointString.data(using: .utf8) else {
|
||||||
|
owsFail("in \(#function) midpointData was unexpectedly nil")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
let midpointByteCount = midpointData.count
|
||||||
|
|
||||||
|
if midpointByteCount < byteCount {
|
||||||
|
lowerBoundCharCount = midpointCharCount
|
||||||
|
} else {
|
||||||
|
upperBoundCharCount = midpointCharCount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return String(self.prefix(upperBoundCharCount))
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue