From e3a4d4f4db730ebe74ed193da34f9dc8b65e411b Mon Sep 17 00:00:00 2001 From: mahaifeng Date: Thu, 5 Sep 2024 15:40:07 +0800 Subject: [PATCH] =?UTF-8?q?[string]=E5=8E=BB=E9=99=A4=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=B8=AD=E6=89=8B=E5=8A=A8=E7=94=9F=E6=88=90=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- uni_modules/uts-tests/utssdk/String.uts | 1012 ++++++++++++++--------- 1 file changed, 603 insertions(+), 409 deletions(-) diff --git a/uni_modules/uts-tests/utssdk/String.uts b/uni_modules/uts-tests/utssdk/String.uts index c809c64..2d48942 100644 --- a/uni_modules/uts-tests/utssdk/String.uts +++ b/uni_modules/uts-tests/utssdk/String.uts @@ -1,412 +1,606 @@ import { describe, test, expect, Result } from './tests.uts' -export function testString(): Result { - return describe("String", () => { - test('length', () => { - const x = "Mozilla"; - expect(x.length).toEqual(7); - // expect(x[0]).toEqual('M'); - const empty = ""; - expect(empty.length).toEqual(0); - // const adlam = "𞤲𞥋𞤣𞤫"; - // expect(adlam.length).toEqual(8); - // const formula = "��𝑥∈ℝ,𝑥²��"; - // expect(formula.length).toEqual(11); - - // 1. web: ��大长度和js引擎有关,在v8中为 2^29 - 24 - // 超出边界报错: RangeError: Invalid string length - // 2. kotlin: ��大长��2^31-1 - // 超出边界报错: Error: targetMethod error::java.lang.OutOfMemoryError: char[] of length - // 3. swift: ��大长度和内存有关 - // 超出边界没有返回信息 - // const length = Math.pow(2, 29) - 24 - // const str = 'x'.repeat(length); - // expect(str.length).toEqual(11); - }) - test('at', () => { - const sentence = 'The quick brown fox jumps over the lazy dog.'; - let index = 5; - expect(sentence.at(index)).toEqual("u"); - index = -4; - expect(sentence.at(index)).toEqual("d"); - expect(sentence.at(999)).toEqual(null); - - let invoiceRef = 'myinvoice01'; - expect(invoiceRef.at(-1)).toEqual("1"); - invoiceRef = 'myinvoice02'; - expect(invoiceRef.at(-1)).toEqual("2"); - expect(invoiceRef.at(-999)).toEqual(null); - - const empty = ""; - expect(empty.at(0)).toEqual(null); - }) - test('charAt', () => { - const anyString = "Brave new world"; - expect(anyString.charAt(0)).toEqual("B"); - expect(anyString.charAt(1)).toEqual("r"); - expect(anyString.charAt(2)).toEqual("a"); - expect(anyString.charAt(3)).toEqual("v"); - expect(anyString.charAt(4)).toEqual("e"); - expect(anyString.charAt(999)).toEqual(""); - expect(anyString.charAt(-1)).toEqual(""); - expect(anyString.charAt(-2)).toEqual(""); - expect(anyString.charAt(-999)).toEqual(""); - - const empty = ""; - expect(empty.charAt(0)).toEqual(""); - }) - test('toWellFormed', () => { - // #ifdef APP-ANDROID - expect("ab\uD800".toWellFormed()).toEqual("ab\uFFFD"); - expect("ab\uD800c".toWellFormed()).toEqual("ab\uFFFDc"); - expect("\uDFFFab".toWellFormed()).toEqual("\uFFFDab"); - expect("c\uDFFFab".toWellFormed()).toEqual("c\uFFFDab"); - expect("abc".toWellFormed()).toEqual("abc"); - expect("ab\uD83D\uDE04c".toWellFormed()).toEqual("ab\uD83D\uDE04c"); - expect("ab\uD83D\uDE04c".toWellFormed()).toEqual("ab\uD83D\uDE04c"); - expect("ab\uD83D\uDE04c\uD83D".toWellFormed()).toEqual("ab\uD83D\uDE04c\uFFFD"); - // #endif - }) - test('isWellFormed', () => { - // #ifdef APP-ANDROID - expect("ab\uD800".isWellFormed()).toEqual(false); - expect("ab\uD800c".isWellFormed()).toEqual(false); - expect("\uDFFFab".isWellFormed()).toEqual(false); - expect("c\uDFFFab".isWellFormed()).toEqual(false); - expect("abc".isWellFormed()).toEqual(true); - expect("ab\uD83D\uDE04c".isWellFormed()).toEqual(true); - expect("ab\uD83D\uDE04c".isWellFormed()).toEqual(true); - expect("ab\uD83D\uDE04c\uD83D".isWellFormed()).toEqual(false); - // #endif - }) - test('charCodeAt', () => { - const sentence = 'The quick brown fox jumps over the lazy dog.'; - const index = 4; - expect(sentence.charCodeAt(index)).toEqual(113); - - expect("ABC".charCodeAt(0)).toEqual(65); - expect("ABC".charCodeAt(1)).toEqual(66); - expect("ABC".charCodeAt(2)).toEqual(67); - expect("ABC".charCodeAt(3)).toEqual(NaN); - - const empty = ""; - expect(empty.charCodeAt(0)).toEqual(NaN); - }) - test('fromCharCode', () => { - expect(String.fromCharCode(65, 66, 67)).toEqual("ABC"); - expect(String.fromCharCode(0x12014)).toEqual("—"); - expect(String.fromCharCode(0xd834, 0xdf06, 0x61, 0xd834, 0xdf07)).toEqual("𝌆a𝌇"); - }) - test('concat', () => { - let hello = 'Hello, ' - expect(hello.concat('Kevin', '. Have a nice day.')).toEqual("Hello, Kevin. Have a nice day."); - expect("".concat('abc')).toEqual("abc"); - }) - test('endsWith', () => { - const str1 = 'Cats are the best!'; - expect(str1.endsWith('best!')).toEqual(true); - expect(str1.endsWith('best', 17)).toEqual(true); - const str2 = 'Is this a question?'; - expect(str2.endsWith('question')).toEqual(false); - - expect("".includes("test")).toEqual(false); - }) - test('includes', () => { - const sentence = 'The quick brown fox jumps over the lazy dog.'; - const word = 'fox'; - expect(sentence.includes(word)).toEqual(true); - - expect("Blue Whale".includes("blue")).toEqual(false); - expect("Blue Whale".toLowerCase().includes("blue")).toEqual(true); - - expect("".includes("test")).toEqual(false); - }) - test('indexOf', () => { - const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?'; - const searchTerm = 'dog'; - const indexOfFirst = paragraph.indexOf(searchTerm); - expect(indexOfFirst).toEqual(40); - expect(paragraph.indexOf(searchTerm, (indexOfFirst + 1))).toEqual(52); - - expect('Blue Whale'.indexOf('Blue')).toEqual(0); - expect('Blue Whale'.indexOf('Blute')).toEqual(-1); - expect('Blue Whale'.indexOf('Whale', 0)).toEqual(5); - expect('Blue Whale'.indexOf('Whale', 5)).toEqual(5); - expect('Blue Whale'.indexOf('Whale', 7)).toEqual(-1); - - expect("".indexOf("test")).toEqual(-1); - }) - test('match', () => { - const str = 'The quick brown fox jumps over the lazy dog. It barked.'; - const result = str.match(new RegExp('[A-Z]', 'g')); - // expect(result!.length).toEqual(2); - expect(result![0]).toEqual("T"); - expect(result![1]).toEqual("I"); - - const result2 = str.match(new RegExp('[A-Z]')); - // expect(result2!.length).toEqual(1); - expect(result2![0]).toEqual("T"); - - // #ifdef APP-ANDROID - const gradientString = 'linear-gradient(to right, rgb(255, 0, 0), #00FF00, hsl(120, 100%, 50%))'; - const pattern = /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)|#([a-fA-F0-9]{2}){3}|hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)/g; - const result3 = gradientString.match(pattern); - expect(result3?.length).toEqual(3); - expect(result3?.[0]).toEqual("rgb(255, 0, 0)"); - expect(result3?.[2]).toEqual("hsl(120, 100%, 50%)"); - - const pattern2 = /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)|#([a-fA-F0-9]{2}){3}|hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)/; - const result4 = gradientString.match(pattern2); - expect(result4?.length).toEqual(8); - expect(result4?.[0]).toEqual("rgb(255, 0, 0)"); - expect(result4?.[1]).toEqual("255"); - expect(result4?.[2]).toEqual("0"); - - - const url = ''; - const urlRegex = /^(\w+):\/\/([^\/?#]+)([^?#]*)(\?[^#]*)?(#.*)?$/; - const match = url.match(urlRegex); - expect(JSON.stringify(match)).toEqual("null"); - // #endif - - }) - test('padEnd', () => { - const str1 = 'Breaded Mushrooms'; - expect(str1.padEnd(25, '.')).toEqual("Breaded Mushrooms........"); - const str2 = '200'; - expect(str2.padEnd(5)).toEqual("200 "); - - expect('abc'.padEnd(10)).toEqual("abc "); - expect('abc'.padEnd(10, "foo")).toEqual("abcfoofoof"); - expect('abc'.padEnd(6, "123456")).toEqual("abc123"); - expect('abc'.padEnd(1)).toEqual("abc"); - }) - test('padStart', () => { - const str1 = '5'; - expect(str1.padStart(2, '0')).toEqual("05"); - - expect('abc'.padStart(10)).toEqual(" abc"); - expect('abc'.padStart(10, "foo")).toEqual("foofoofabc"); - expect('abc'.padStart(6, "123456")).toEqual("123abc"); - expect('abc'.padStart(8, "0")).toEqual("00000abc"); - expect('abc'.padStart(1)).toEqual("abc"); - }) - test('repeat', () => { - const str1 = 'abc'; - expect(str1.repeat(0)).toEqual(""); - expect(str1.repeat(1)).toEqual("abc"); - expect(str1.repeat(2)).toEqual("abcabc"); - expect(str1.repeat(3.5)).toEqual("abcabcabc"); - - expect("".repeat(1)).toEqual(""); - }) - test('replace', () => { - const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; - expect(p.replace('dog', 'monkey')).toEqual("The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"); - const regex = /Dog/i; - expect(p.replace(regex, 'ferret')).toEqual("The quick brown fox jumps over the lazy ferret. If the dog reacted, was it really lazy?"); - const str = 'abc12345#$*%'; - const replacer = (match:string, p: string[], offset:number, string:string): string => { - // p1 is nondigits, p2 digits, and p3 non-alphanumerics - expect(offset).toEqual(0); - expect(match).toEqual(str); - expect(string).toEqual(str); - return p.join(' - '); - } - - // const REGEX_FORMAT = /[YMDHhms]o|\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g - // const formatStr = 'This is a [sample] text with [another] capture group.' - // const nextStr = formatStr.replace(REGEX_FORMAT, (match:string, p1: string|null, offset: number, string: string):string =>{ - // console.log('123', p1, match) - // return p1 ?? match ?? '' - // }) - // expect(nextStr).toEqual('This is a sample text with another capture group.'); - // var newString = str.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); - // expect(newString).toEqual("abc - 12345 - #$*%"); - // const str1 = 'hello, world'; - // const newString1 = str1.replace(/world/, (match: string, offset:number):string => `JavaScript (${offset})`); - // expect(newString1).toEqual('hello, JavaScript (7)'); - }) - test('search', () => { - const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?'; - const regex = /[^\w\s]/g; - expect(paragraph.search(regex)).toEqual(43); - - var str = "hey JudE"; - var re = /[A-Z]/g; - var re2 = /[.]/g; - expect(str.search(re)).toEqual(4); - expect(str.search(re2)).toEqual(-1); - expect("".search(re2)).toEqual(-1); - }) - test('slice', () => { - const str = 'The quick brown fox jumps over the lazy dog.'; - expect(str.slice(31)).toEqual("the lazy dog."); - - let str1 = 'The morning is upon us.', // str1 的长��length ��23�� - str2 = str1.slice(1, 8), - str3 = str1.slice(4, -2), - str4 = str1.slice(12), - str5 = str1.slice(30), - str6 = str1.slice(); - expect(str2).toEqual("he morn"); - expect(str3).toEqual("morning is upon u"); - expect(str4).toEqual("is upon us."); - expect(str5).toEqual(""); - expect(str6).toEqual("The morning is upon us."); - - expect("".slice()).toEqual(""); - - expect("abcdefg".slice(-1)).toEqual("g"); - expect("abcdefg".slice(-1,-2)).toEqual(""); - - }) - test('split', () => { - const str = 'The quick brown fox jumps over the lazy dog.'; - const words = str.split(' '); - expect(words[3]).toEqual("fox"); - const chars = str.split(''); - expect(chars[8]).toEqual("k"); - - var myString = "Hello World. How are you doing?"; - var splits = myString.split(" ", 3); - var splits1 = myString.split(" ", 10); - expect(splits).toEqual(["Hello", "World.", "How"]); - expect(splits1).toEqual(['Hello', 'World.', 'How', 'are', 'you', 'doing?']); - - expect(''.split('')).toEqual([]) - expect('abc'.split('b')).toEqual(["a", "c"]) - expect('abc'.split('d')).toEqual(["abc"]) - - var str1 = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand "; - var re1 = /\s*(?:;|$)\s*/; - expect(str1.split(re1)).toEqual([ "Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", "" ]) - - var str2 = "a, b, c, d, e"; - var re2 = /,\s*/g; - expect(str2.split(re2)).toEqual(["a", "b", "c", "d", "e"]); - - var str3 = "foo-bar_baz(qux-quux)_corge"; - var re3 = new RegExp("[_-](?![^(]*\\))", "g"); - expect(str3.split(re3)).toEqual(["foo", "bar", "baz(qux-quux)", "corge"]); - - var str4 = "a, b, {c, d, e}, f, g, h"; - var re4 = /,(?![^{]*\})/; - expect(str4.split(re4)).toEqual(["a", " b", " {c, d, e}", " f", " g", " h"]); - }) - test('toLowerCase', () => { - const str1 = '中文����zh-CN || zh-Hans'; - expect(str1.toLowerCase()).toEqual("中文����zh-cn || zh-hans"); - const str2 = 'ALPHABET'; - expect(str2.toLowerCase()).toEqual("alphabet"); - }) - test('toUpperCase', () => { - const sentence = 'The quick brown fox jumps over the lazy dog.'; - expect(sentence.toUpperCase()).toEqual("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."); - }) - - test("lastIndexOf", () => { - expect('canal'.lastIndexOf('a')).toEqual(3); - expect('canal'.lastIndexOf('a', 2)).toEqual(1); - expect('canal'.lastIndexOf('a', 0)).toEqual(-1); - expect('canal'.lastIndexOf('')).toEqual(5); - expect('canal'.lastIndexOf('', 2)).toEqual(2); - expect("Blue Whale, Killer Whale".lastIndexOf("Whale")).toEqual(19); - expect("Blue Whale, Killer Whale".lastIndexOf("blue")).toEqual(-1); - }) - test("substring", () => { - var str1 = "Mozilla"; - expect(str1.substring(0, 3)).toEqual("Moz"); - expect(str1.substring(3, 0)).toEqual("Moz"); - expect(str1.substring(3, -3)).toEqual("Moz"); - - var str2 = "hello world"; - // expect(str2.substring()).toEqual("hello world"); - expect(str2.substring(6)).toEqual("world"); - expect(str2.substring(0)).toEqual("hello world"); - expect(str2.substring(0, 5)).toEqual("hello"); - expect(str2.substring(6, 11)).toEqual("world"); - expect(str2.substring(3, 8)).toEqual("lo wo"); - expect(str2.substring(0, -1)).toEqual(""); - expect(str2.substring(0, 20)).toEqual("hello world"); - - var str3 = "aaa"; - expect(str3.substring(10, 1)).toEqual("aa"); - }) - test("trim", () => { - const greeting = ' Hello world! '; - expect(greeting).toEqual(" Hello world! "); - expect(greeting.trim()).toEqual("Hello world!"); - const orig:string = ' foo '; - expect(orig.trim()).toEqual("foo"); - const str = '\t\t\tworld\t\t\t'; - expect(str.trim()).toEqual('world'); - const str1 = '\n\n\nhello\n\n\n'; - expect(str1.trim()).toEqual('hello'); - const str2 = ''; - expect(str2.trim()).toEqual(''); - }) - test("trimStart", () => { - const str = ' Hello World '; - expect(str.trimStart()).toEqual('Hello World '); - const str1 = 'Hello World'; - expect(str1.trimStart()).toEqual(str1); - const str2 = ' \t \n '; - expect(str2.trimStart()).toEqual(''); - }) - test("trimEnd", () => { - const str = ' Hello World '; - expect(str.trimEnd()).toEqual(' Hello World'); - const str1 = 'Hello World'; - expect(str1.trimEnd()).toEqual(str1); - const str2 = ' \t \n '; - expect(str2.trimEnd()).toEqual(''); - }) - test("startsWith", () => { - const str = 'hello world'; - expect(str.startsWith('hello')).toEqual(true); - expect(str.startsWith('h')).toEqual(true); - expect(str.startsWith('HELLO')).toEqual(false); - expect(str.startsWith('o')).toEqual(false); - - const str1:string = "To be, or not to be, that is the question."; - expect(str1.startsWith("To be")).toEqual(true); - expect(str1.startsWith("not to be")).toEqual(false); - expect(str1.startsWith("not to be", 10)).toEqual(true); - expect(str1.startsWith("not to be", 8)).toEqual(false); - }) - test("matchAll", () => { - // const reg = /t(e)(st(\d?))/g; - // const str = 'test1test2'; - // const result = [...str.matchAll(reg)]; - // expect(result[0]).toEqual(["test1", "e", "st1", "1"]); - // expect(result[1]).toEqual(["test2", "e", "st2", "2"]); - - // const reg1 = /[A-Z]/g; - // const str1 = 'The quick brown fox jumps over the lazy dog'; - // const result1 = [...str1.matchAll(reg1)]; - // expect(result1[0]).toEqual(["T"]); - }) - test("replaceAll", () => { - // const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; - // expect(p.replaceAll('dog', 'monkey')).toEqual("The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy?"); - // const regex = /Dog/ig; - // expect(p.replaceAll(regex, 'ferret')).toEqual( "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"); - - // const reg = /[aeiou]/g; - // const str = 'The quick brown fox jumps over the lazy dog'; - // const result = str.replaceAll(reg, '!'); - // expect(result).toEqual("Th! q!!ck br!wn f!x j!mps !v!r th! l!zy d!g"); - - // const reg1 = /o/g; - // const str1 = 'Hello World!'; - // const result1 = str1.replaceAll(reg1, (match, offset, original) => { - // expect(match).toEqual('o'); - // expect(original[offset]).toEqual('o'); - // expect(original).toEqual(str1); - // return `x`; - // }); - // expect(result1).toEqual("Hellx Wxrld!"); - }) +export function testString() : Result { + return describe("String", () => { + test('length', () => { + // #TEST String.length + const x = "Mozilla"; + const e = ""; + + console.log("Mozilla is " + x.length + " code units long"); + /* "Mozilla is 7 code units long" */ + + console.log("The empty string is has a length of " + e.length); + /* "The e string is has a length of 0" */ + // #END + + expect(x.length).toEqual(7); + // expect(x[0]).toEqual('M'); + const empty = ""; + expect(empty.length).toEqual(0); + // const adlam = "𞤲𞥋𞤣𞤫"; + // expect(adlam.length).toEqual(8); + // const formula = "��𝑥∈ℝ,𝑥²��"; + // expect(formula.length).toEqual(11); + + // 1. web: ��大长度和js引擎有关,在v8中为 2^29 - 24 + // 超出边界报错: RangeError: Invalid string length + // 2. kotlin: ��大长��2^31-1 + // 超出边界报错: Error: targetMethod error::java.lang.OutOfMemoryError: char[] of length + // 3. swift: ��大长度和内存有关 + // 超出边界没有返回信息 + // const length = Math.pow(2, 29) - 24 + // const str = 'x'.repeat(length); + // expect(str.length).toEqual(11); + }) + test('at', () => { + // #TEST String.at + const sentence = 'The quick brown fox jumps over the lazy dog.'; + let index = 5; + console.log(`Using an index of ${index} the character returned is ${sentence.at(index)}`); + // expected output: "Using an index of 5 the character returned is u" + index = -4; + console.log(`Using an index of ${index} the character returned is ${sentence.at(index)}`); + // expected output: "Using an index of -4 the character returned is d" + // #END + + index = 5; + expect(sentence.at(index)).toEqual("u"); + index = -4; + expect(sentence.at(index)).toEqual("d"); + expect(sentence.at(999)).toEqual(null); + + let invoiceRef = 'myinvoice01'; + expect(invoiceRef.at(-1)).toEqual("1"); + invoiceRef = 'myinvoice02'; + expect(invoiceRef.at(-1)).toEqual("2"); + expect(invoiceRef.at(-999)).toEqual(null); + + const empty = ""; + expect(empty.at(0)).toEqual(null); + }) + test('charAt', () => { + // #TEST String.charAt + const anyString = "Brave new world"; + console.log("The character at index 0 is '" + anyString.charAt(0) + "'"); + // The character at index 0 is 'B' + console.log("The character at index 1 is '" + anyString.charAt(1) + "'"); + // The character at index 1 is 'r' + console.log("The character at index 2 is '" + anyString.charAt(2) + "'"); + // The character at index 2 is 'a' + console.log("The character at index 3 is '" + anyString.charAt(3) + "'"); + // The character at index 3 is 'v' + console.log("The character at index 4 is '" + anyString.charAt(4) + "'"); + // The character at index 4 is 'e' + console.log("The character at index 999 is '" + anyString.charAt(999) + "'"); + // The character at index 999 is '' + // #END + + + + expect(anyString.charAt(0)).toEqual("B"); + expect(anyString.charAt(1)).toEqual("r"); + expect(anyString.charAt(2)).toEqual("a"); + expect(anyString.charAt(3)).toEqual("v"); + expect(anyString.charAt(4)).toEqual("e"); + expect(anyString.charAt(999)).toEqual(""); + expect(anyString.charAt(-1)).toEqual(""); + expect(anyString.charAt(-2)).toEqual(""); + expect(anyString.charAt(-999)).toEqual(""); + + const empty = ""; + expect(empty.charAt(0)).toEqual(""); + }) + test('toWellFormed', () => { + // #ifdef APP-ANDROID + // #TEST String.toWellFormed + let ret = "ab\uD800".toWellFormed() + console.log(ret) //"ab\uFFFD" + // #END + + expect(ret).toEqual("ab\uFFFD"); + expect("ab\uD800c".toWellFormed()).toEqual("ab\uFFFDc"); + expect("\uDFFFab".toWellFormed()).toEqual("\uFFFDab"); + expect("c\uDFFFab".toWellFormed()).toEqual("c\uFFFDab"); + expect("abc".toWellFormed()).toEqual("abc"); + expect("ab\uD83D\uDE04c".toWellFormed()).toEqual("ab\uD83D\uDE04c"); + expect("ab\uD83D\uDE04c".toWellFormed()).toEqual("ab\uD83D\uDE04c"); + expect("ab\uD83D\uDE04c\uD83D".toWellFormed()).toEqual("ab\uD83D\uDE04c\uFFFD"); + // #endif + }) + test('isWellFormed', () => { + // #ifdef APP-ANDROID + // #TEST String.isWellFormed + let ret = "ab\uD800".isWellFormed() + console.log(ret) //false + // #END + + expect(ret).toEqual(false); + expect("ab\uD800c".isWellFormed()).toEqual(false); + expect("\uDFFFab".isWellFormed()).toEqual(false); + expect("c\uDFFFab".isWellFormed()).toEqual(false); + expect("abc".isWellFormed()).toEqual(true); + expect("ab\uD83D\uDE04c".isWellFormed()).toEqual(true); + expect("ab\uD83D\uDE04c".isWellFormed()).toEqual(true); + expect("ab\uD83D\uDE04c\uD83D".isWellFormed()).toEqual(false); + // #endif + }) + test('charCodeAt', () => { + // #TEST String.charCodeAt + const sentence = 'The quick brown fox jumps over the lazy dog.'; + const index = 4; + console.log(`The character code ${sentence.charCodeAt(index)} is equal to ${sentence.charAt(index)}`); + // expected output: "The character code 113 is equal to q" + // #END + + expect(sentence.charCodeAt(index)).toEqual(113); + + expect("ABC".charCodeAt(0)).toEqual(65); + expect("ABC".charCodeAt(1)).toEqual(66); + expect("ABC".charCodeAt(2)).toEqual(67); + expect("ABC".charCodeAt(3)).toEqual(NaN); + + const empty = ""; + expect(empty.charCodeAt(0)).toEqual(NaN); + }) + test('fromCharCode', () => { + // #TEST String.fromCharCode + console.log(String.fromCharCode(65, 66, 67)); + // expected output: "ABC" + console.log(String.fromCharCode(0x12014)); + // expected output: "𝌆a𝌇" + // #END + + expect(String.fromCharCode(65, 66, 67)).toEqual("ABC"); + expect(String.fromCharCode(0x12014)).toEqual("—"); + expect(String.fromCharCode(0xd834, 0xdf06, 0x61, 0xd834, 0xdf07)).toEqual("𝌆a𝌇"); + }) + test('concat', () => { + // #TEST String.concat + let hello = 'Hello, ' + let ret1 = hello.concat('Kevin', '. Have a nice day.') + console.log(ret1) + // Hello, Kevin. Have a nice day. + // #END + + expect(ret1).toEqual("Hello, Kevin. Have a nice day."); + expect("".concat('abc')).toEqual("abc"); + }) + test('endsWith', () => { + // #TEST String.endsWith + const str1 = 'Cats are the best!'; + console.log(str1.endsWith('best!')); + // expected output: true + console.log(str1.endsWith('best', 17)); + // expected output: true + const str2 = 'Is this a question?'; + console.log(str2.endsWith('question')); + // expected output: false + // #END + + expect(str1.endsWith('best!')).toEqual(true); + expect(str1.endsWith('best', 17)).toEqual(true); + expect(str2.endsWith('question')).toEqual(false); + expect("".includes("test")).toEqual(false); + }) + test('includes', () => { + + // #TEST String.includes + const sentence = 'The quick brown fox jumps over the lazy dog.'; + const word = 'fox'; + console.log(sentence.includes(word)) // true + // #END + + expect(sentence.includes(word)).toEqual(true); + + expect("Blue Whale".includes("blue")).toEqual(false); + expect("Blue Whale".toLowerCase().includes("blue")).toEqual(true); + + expect("".includes("test")).toEqual(false); + }) + test('indexOf', () => { + // #TEST String.indexOf + const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?'; + const searchTerm = 'dog'; + const indexOfFirst = paragraph.indexOf(searchTerm); + console.log(`The index of the first "${searchTerm}" from the beginning is ${indexOfFirst}`); + // expected output: "The index of the first "dog" from the beginning is 40" + + console.log(`The index of the 2nd "${searchTerm}" is ${paragraph.indexOf(searchTerm, (indexOfFirst + 1))}`); + // expected output: "The index of the 2nd "dog" is 52" + // #END + + expect(indexOfFirst).toEqual(40); + expect(paragraph.indexOf(searchTerm, (indexOfFirst + 1))).toEqual(52); + + expect('Blue Whale'.indexOf('Blue')).toEqual(0); + expect('Blue Whale'.indexOf('Blute')).toEqual(-1); + expect('Blue Whale'.indexOf('Whale', 0)).toEqual(5); + expect('Blue Whale'.indexOf('Whale', 5)).toEqual(5); + expect('Blue Whale'.indexOf('Whale', 7)).toEqual(-1); + + expect("".indexOf("test")).toEqual(-1); + }) + test('match', () => { + // #TEST String.match + const str = 'The quick brown fox jumps over the lazy dog. It barked.'; + const result = str.match(new RegExp('[A-Z]', 'g')); + console.log(result![0])//"T" + // #END + // expect(result!.length).toEqual(2); + expect(result![0]).toEqual("T"); + expect(result![1]).toEqual("I"); + + const result2 = str.match(new RegExp('[A-Z]')); + // expect(result2!.length).toEqual(1); + expect(result2![0]).toEqual("T"); + + // #ifdef APP-ANDROID + const gradientString = 'linear-gradient(to right, rgb(255, 0, 0), #00FF00, hsl(120, 100%, 50%))'; + const pattern = /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)|#([a-fA-F0-9]{2}){3}|hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)/g; + const result3 = gradientString.match(pattern); + expect(result3?.length).toEqual(3); + expect(result3?.[0]).toEqual("rgb(255, 0, 0)"); + expect(result3?.[2]).toEqual("hsl(120, 100%, 50%)"); + + const pattern2 = /rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)|#([a-fA-F0-9]{2}){3}|hsl\(\s*(\d{1,3})\s*,\s*(\d{1,3})%\s*,\s*(\d{1,3})%\s*\)/; + const result4 = gradientString.match(pattern2); + expect(result4?.length).toEqual(8); + expect(result4?.[0]).toEqual("rgb(255, 0, 0)"); + expect(result4?.[1]).toEqual("255"); + expect(result4?.[2]).toEqual("0"); + + + const url = ''; + const urlRegex = /^(\w+):\/\/([^\/?#]+)([^?#]*)(\?[^#]*)?(#.*)?$/; + const match = url.match(urlRegex); + expect(JSON.stringify(match)).toEqual("null"); + // #endif + + }) + test('padEnd', () => { + // #TEST String.padEnd + const str1 = 'Breaded Mushrooms'; + let ret1= str1.padEnd(25, '.') + console.log(ret1); + // expected output: "Breaded Mushrooms........" + const str2 = '200'; + let ret2=str2.padEnd(5) + console.log(ret2); + // expected output: "200 " + // #END + + expect(str1.padEnd(25, '.')).toEqual("Breaded Mushrooms........"); + expect(ret2).toEqual("200 "); + + expect('abc'.padEnd(10)).toEqual("abc "); + expect('abc'.padEnd(10, "foo")).toEqual("abcfoofoof"); + expect('abc'.padEnd(6, "123456")).toEqual("abc123"); + expect('abc'.padEnd(1)).toEqual("abc"); + }) + test('padStart', () => { + // #TEST String.padStart + const str1 = '5'; + let ret = str1.padStart(2, '0') + console.log(ret); + // expected output: "05" + // #END + + expect(ret).toEqual("05"); + + expect('abc'.padStart(10)).toEqual(" abc"); + expect('abc'.padStart(10, "foo")).toEqual("foofoofabc"); + expect('abc'.padStart(6, "123456")).toEqual("123abc"); + expect('abc'.padStart(8, "0")).toEqual("00000abc"); + expect('abc'.padStart(1)).toEqual("abc"); + }) + test('repeat', () => { + const str1 = 'abc'; + // #TEST String.repeat + "abc".repeat(0) // "" + "abc".repeat(1) // "abc" + "abc".repeat(2) // "abcabc" + "abc".repeat(3.5) // "abcabcabc" 参数 count 将会被自动转换成整数。 + // #END + expect(str1.repeat(0)).toEqual(""); + expect(str1.repeat(1)).toEqual("abc"); + expect(str1.repeat(2)).toEqual("abcabc"); + expect(str1.repeat(3.5)).toEqual("abcabcabc"); + + expect("".repeat(1)).toEqual(""); + }) + test('replace', () => { + // #TEST String.replace + const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; + let ret1 = p.replace('dog', 'monkey') + + console.log(ret1); + // expected output: "The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?" + const regex = /Dog/i; + let ret2 = p.replace(regex, 'ferret') + console.log(ret2); + // expected output: "The quick brown fox jumps over the lazy ferret. If the dog reacted, was it really lazy?" + // #END + + expect(ret1).toEqual("The quick brown fox jumps over the lazy monkey. If the dog reacted, was it really lazy?"); + expect(ret2).toEqual("The quick brown fox jumps over the lazy ferret. If the dog reacted, was it really lazy?"); + const str = 'abc12345#$*%'; + const replacer = (match : string, p : string[], offset : number, string : string) : string => { + // p1 is nondigits, p2 digits, and p3 non-alphanumerics + expect(offset).toEqual(0); + expect(match).toEqual(str); + expect(string).toEqual(str); + return p.join(' - '); + } + + + // #TEST String.replace_1 + // 不包含捕捉组的示例 + let a = "The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?" + let b = a.replace(RegExp("fox"), function (match : string, offset : number, string : string) : string { + console.log("match", match) + console.log("offset", offset) + console.log("string", string) + return "cat" + }) + console.log("b:", b) + + // 包含一个捕获组的示例。注意,目前android仅支持最多五个捕获组 + let a1 = "The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?" + let b1 = a1.replace(RegExp("(fox)"), function (match : string, p1 : string, offset : number, string : string) : string { + console.log("match", match) + console.log("p1", p1) + console.log("offset", offset) + console.log("string", string) + return "cat" + }) + console.log("b1", b1) + // #END + + // const REGEX_FORMAT = /[YMDHhms]o|\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a{1,2}|A{1,2}|m{1,2}|s{1,2}|Z{1,2}|SSS/g + // const formatStr = 'This is a [sample] text with [another] capture group.' + // const nextStr = formatStr.replace(REGEX_FORMAT, (match:string, p1: string|null, offset: number, string: string):string =>{ + // console.log('123', p1, match) + // return p1 ?? match ?? '' + // }) + // expect(nextStr).toEqual('This is a sample text with another capture group.'); + // var newString = str.replace(/([^\d]*)(\d*)([^\w]*)/, replacer); + // expect(newString).toEqual("abc - 12345 - #$*%"); + // const str1 = 'hello, world'; + // const newString1 = str1.replace(/world/, (match: string, offset:number):string => `JavaScript (${offset})`); + // expect(newString1).toEqual('hello, JavaScript (7)'); + }) + test('search', () => { + // #TEST String.search + const paragraph = 'The quick brown fox jumps over the lazy dog. If the dog barked, was it really lazy?'; + const regex = /[^\w\s]/g; + console.log(paragraph.search(regex)); + // expected output: 43 + console.log(paragraph[paragraph.search(regex)]); + // expected output: "." + // #END + + expect(paragraph.search(regex)).toEqual(43); + + var str = "hey JudE"; + var re = /[A-Z]/g; + var re2 = /[.]/g; + expect(str.search(re)).toEqual(4); + expect(str.search(re2)).toEqual(-1); + expect("".search(re2)).toEqual(-1); + }) + test('slice', () => { + // #TEST String.slice + const str = 'The quick brown fox jumps over the lazy dog.'; + let ret = str.slice(31) + console.log(ret); + // expected output: "the lazy dog." + console.log(str.slice(4, 19)); + // expected output: "quick brown fox" + // #END + + expect(ret).toEqual("the lazy dog."); + + let str1 = 'The morning is upon us.', // str1 的长��length ��23�� + str2 = str1.slice(1, 8), + str3 = str1.slice(4, -2), + str4 = str1.slice(12), + str5 = str1.slice(30), + str6 = str1.slice(); + expect(str2).toEqual("he morn"); + expect(str3).toEqual("morning is upon u"); + expect(str4).toEqual("is upon us."); + expect(str5).toEqual(""); + expect(str6).toEqual("The morning is upon us."); + + expect("".slice()).toEqual(""); + + expect("abcdefg".slice(-1)).toEqual("g"); + expect("abcdefg".slice(-1, -2)).toEqual(""); + + }) + test('split', () => { + // #TEST String.split + const str = 'The quick brown fox jumps over the lazy dog.'; + const words = str.split(' '); + let ret1 = words[3] + console.log(ret1); + // expected output: "fox" + const chars = str.split(''); + console.log(chars[8]); + // expected output: "k" + // #END + + expect(ret1).toEqual("fox"); + expect(chars[8]).toEqual("k"); + + var myString = "Hello World. How are you doing?"; + var splits = myString.split(" ", 3); + var splits1 = myString.split(" ", 10); + expect(splits).toEqual(["Hello", "World.", "How"]); + expect(splits1).toEqual(['Hello', 'World.', 'How', 'are', 'you', 'doing?']); + + expect(''.split('')).toEqual([]) + expect('abc'.split('b')).toEqual(["a", "c"]) + expect('abc'.split('d')).toEqual(["abc"]) + + var str1 = "Harry Trump ;Fred Barney; Helen Rigby ; Bill Abel ;Chris Hand "; + var re1 = /\s*(?:;|$)\s*/; + expect(str1.split(re1)).toEqual(["Harry Trump", "Fred Barney", "Helen Rigby", "Bill Abel", "Chris Hand", ""]) + + var str2 = "a, b, c, d, e"; + var re2 = /,\s*/g; + expect(str2.split(re2)).toEqual(["a", "b", "c", "d", "e"]); + + var str3 = "foo-bar_baz(qux-quux)_corge"; + var re3 = new RegExp("[_-](?![^(]*\\))", "g"); + expect(str3.split(re3)).toEqual(["foo", "bar", "baz(qux-quux)", "corge"]); + + var str4 = "a, b, {c, d, e}, f, g, h"; + var re4 = /,(?![^{]*\})/; + expect(str4.split(re4)).toEqual(["a", " b", " {c, d, e}", " f", " g", " h"]); + }) + test('toLowerCase', () => { + // #TEST String.toLowerCase + const str1 = '中文简体 zh-CN || zh-Hans'; + const str2 = 'ALPHABET'; + console.log('str1'.toLowerCase()); + // 中文简体 zh-cn || zh-hans + console.log(str2.toLowerCase()); + // "alphabet" + // #END + + expect(str1.toLowerCase()).toEqual("中文简体 zh-cn || zh-hans"); + + expect(str2.toLowerCase()).toEqual("alphabet"); + }) + test('toUpperCase', () => { + // #TEST String.toUpperCase + const sentence = 'The quick brown fox jumps over the lazy dog.'; + console.log(sentence.toUpperCase()); + // expected output: "THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG." + // #END + + expect(sentence.toUpperCase()).toEqual("THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG."); + }) + + test("lastIndexOf", () => { + // #TEST String.lastIndexOf + console.log('canal'.lastIndexOf('a'))//3 + // #END + expect('canal'.lastIndexOf('a')).toEqual(3); + expect('canal'.lastIndexOf('a', 2)).toEqual(1); + expect('canal'.lastIndexOf('a', 0)).toEqual(-1); + expect('canal'.lastIndexOf('')).toEqual(5); + expect('canal'.lastIndexOf('', 2)).toEqual(2); + expect("Blue Whale, Killer Whale".lastIndexOf("Whale")).toEqual(19); + expect("Blue Whale, Killer Whale".lastIndexOf("blue")).toEqual(-1); + }) + test("substring", () => { + // #TEST String.substr + var str1 = "Mozilla"; + let ret = str1.substring(0, 3) + console.log(ret)//"Moz" + // #END + + expect(ret).toEqual("Moz"); + expect(str1.substring(3, 0)).toEqual("Moz"); + expect(str1.substring(3, -3)).toEqual("Moz"); + + var str2 = "hello world"; + // expect(str2.substring()).toEqual("hello world"); + expect(str2.substring(6)).toEqual("world"); + expect(str2.substring(0)).toEqual("hello world"); + expect(str2.substring(0, 5)).toEqual("hello"); + expect(str2.substring(6, 11)).toEqual("world"); + expect(str2.substring(3, 8)).toEqual("lo wo"); + expect(str2.substring(0, -1)).toEqual(""); + expect(str2.substring(0, 20)).toEqual("hello world"); + + var str3 = "aaa"; + expect(str3.substring(10, 1)).toEqual("aa"); + }) + test("trim", () => { + // #TEST String.trim + let greeting = ' Hello world! '; + let ret = greeting.trim() + console.log(ret) //Hello world! + // #END + expect(ret).toEqual("Hello world!"); + const orig : string = ' foo '; + expect(orig.trim()).toEqual("foo"); + const str = '\t\t\tworld\t\t\t'; + expect(str.trim()).toEqual('world'); + const str1 = '\n\n\nhello\n\n\n'; + expect(str1.trim()).toEqual('hello'); + const str2 = ''; + expect(str2.trim()).toEqual(''); + }) + test("trimStart", () => { + const str = ' Hello World '; + expect(str.trimStart()).toEqual('Hello World '); + const str1 = 'Hello World'; + expect(str1.trimStart()).toEqual(str1); + const str2 = ' \t \n '; + expect(str2.trimStart()).toEqual(''); + }) + test("trimEnd", () => { + const str = ' Hello World '; + expect(str.trimEnd()).toEqual(' Hello World'); + const str1 = 'Hello World'; + expect(str1.trimEnd()).toEqual(str1); + const str2 = ' \t \n '; + expect(str2.trimEnd()).toEqual(''); + }) + test("startsWith", () => { + // #TEST String.startsWith + const str = 'hello world'; + console.log(str.startsWith('hello'))//true + // #END + + expect(str.startsWith('hello')).toEqual(true); + expect(str.startsWith('h')).toEqual(true); + expect(str.startsWith('HELLO')).toEqual(false); + expect(str.startsWith('o')).toEqual(false); + + const str1 : string = "To be, or not to be, that is the question."; + expect(str1.startsWith("To be")).toEqual(true); + expect(str1.startsWith("not to be")).toEqual(false); + expect(str1.startsWith("not to be", 10)).toEqual(true); + expect(str1.startsWith("not to be", 8)).toEqual(false); + }) + test("matchAll", () => { + // const reg = /t(e)(st(\d?))/g; + // const str = 'test1test2'; + // const result = [...str.matchAll(reg)]; + // expect(result[0]).toEqual(["test1", "e", "st1", "1"]); + // expect(result[1]).toEqual(["test2", "e", "st2", "2"]); + + // const reg1 = /[A-Z]/g; + // const str1 = 'The quick brown fox jumps over the lazy dog'; + // const result1 = [...str1.matchAll(reg1)]; + // expect(result1[0]).toEqual(["T"]); + }) + test("replaceAll", () => { + // const p = 'The quick brown fox jumps over the lazy dog. If the dog reacted, was it really lazy?'; + // expect(p.replaceAll('dog', 'monkey')).toEqual("The quick brown fox jumps over the lazy monkey. If the monkey reacted, was it really lazy?"); + // const regex = /Dog/ig; + // expect(p.replaceAll(regex, 'ferret')).toEqual( "The quick brown fox jumps over the lazy ferret. If the ferret reacted, was it really lazy?"); + + // const reg = /[aeiou]/g; + // const str = 'The quick brown fox jumps over the lazy dog'; + // const result = str.replaceAll(reg, '!'); + // expect(result).toEqual("Th! q!!ck br!wn f!x j!mps !v!r th! l!zy d!g"); + + // const reg1 = /o/g; + // const str1 = 'Hello World!'; + // const result1 = str1.replaceAll(reg1, (match, offset, original) => { + // expect(match).toEqual('o'); + // expect(original[offset]).toEqual('o'); + // expect(original).toEqual(str1); + // return `x`; + // }); + // expect(result1).toEqual("Hellx Wxrld!"); }) -} + }) +} \ No newline at end of file -- GitLab