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