├── .gitignore
├── .sbt-depts-scalafmt.conf
├── .scalafmt.conf
├── LICENSE
├── ReadMe.md
├── build.sbt
├── modules
└── bridge
│ ├── build.sbt
│ └── src
│ ├── main
│ └── scala
│ │ └── commons
│ │ └── lang3
│ │ └── bridge
│ │ ├── StringCommons.scala
│ │ └── StringUtils.scala
│ └── test
│ └── scala
│ └── commons
│ └── lang3
│ └── bridge
│ ├── StringUtilsContainsSpec.scala
│ ├── StringUtilsEqualsIndexOfSpec.scala
│ ├── StringUtilsIEmptyBlankSpec.scala
│ ├── StringUtilsSpec.scala
│ ├── StringUtilsStartsEndsWithSpec.scala
│ ├── StringUtilsSubstringSpec.scala
│ └── StringUtilsTrimStripSpec.scala
└── project
├── CommonSettings.scala
├── ProjectKeys.scala
├── build.properties
├── plugins.sbt
├── project
└── sbt-depts-djx314-lib.sbt
└── sbt-depts-plugin.sbt
/.gitignore:
--------------------------------------------------------------------------------
1 | /sbt
2 | **/target/
3 | /.bsp/
4 | /.idea/
5 | **/.bloop/
6 | /.metals/
7 | **/metals.sbt
8 | /.vscode/
9 | /sbt.bat
10 | /sbt-launch.jar
--------------------------------------------------------------------------------
/.sbt-depts-scalafmt.conf:
--------------------------------------------------------------------------------
1 | maxColumn = 140
2 | align.preset = more
3 | continuationIndent.defnSite = 2
4 | lineEndings = unix
5 | optIn.breakChainOnFirstMethodDot = false
6 | rewrite.rules = [SortImports]
7 | version = 3.7.14
8 | runner.dialect = scala3
9 |
--------------------------------------------------------------------------------
/.scalafmt.conf:
--------------------------------------------------------------------------------
1 | include "./.sbt-depts-scalafmt.conf"
2 | project.excludePaths = [
3 | ]
4 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
10 |
11 | "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
12 |
13 | "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
14 |
15 | "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
16 |
17 | "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
18 |
19 | "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
20 |
21 | "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
22 |
23 | "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
24 |
25 | "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
26 |
27 | "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
28 |
29 | 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
30 |
31 | 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
32 |
33 | 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
34 |
35 | You must give any other recipients of the Work or Derivative Works a copy of this License; and
36 | You must cause any modified files to carry prominent notices stating that You changed the files; and
37 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
38 | If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
39 |
40 | You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
41 | 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
42 |
43 | 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
44 |
45 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
46 |
47 | 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
48 |
49 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
50 |
51 | END OF TERMS AND CONDITIONS
--------------------------------------------------------------------------------
/ReadMe.md:
--------------------------------------------------------------------------------
1 | # Commons Lang3 Scala Bridge
2 |
3 | [](https://search.maven.org/search?q=g:%22net.scalax%22%20AND%20a:%22commons-lang3-bridge_3%22)
4 |
5 | A scala bridge library from apache commons lang3 to scala.
6 |
7 | ## Usage
8 |
9 | Add dependence into sbt like:
10 |
11 | ```scala
12 | libraryDependencies += "net.scalax" %% "commons-lang3-bridge" % "0.1.0"
13 | libraryDependencies += "org.apache.commons" % "commons-lang3" % "3.13.0"
14 | ```
15 |
16 | or maven:
17 | ```xml
18 |
19 | net.scalax
20 | commons-lang3-bridge_3
21 | 0.1.0
22 |
23 |
24 | org.apache.commons
25 | commons-lang3
26 | 3.13.0
27 |
28 | ```
29 |
30 | *Commons lang3 bridge support scala 2.11, 2.12, 2.13, 3.1, and 3.2, choice edition by prefix.*
31 |
32 | Add import in your source:
33 |
34 | ```scala
35 | import commons.lang3.bridge.StringUtils.ops._
36 | ```
37 |
38 | Now, you can call commons lang string utils functions as String or `Option[String]`'s method like:
39 |
40 | ```scala
41 | test("test string substring after last separator char") {
42 | assert(nullString.ops.substringAfterLast(0).isEmpty)
43 | assert(noneString.ops.substringAfterLast('X').isEmpty)
44 | assert("".ops.substringAfterLast(0).contains(""))
45 | assert(Some("").ops.substringAfterLast('a').contains(""))
46 |
47 | assert("foo".ops.substringAfterLast(0).contains(""))
48 | assert("foo".ops.substringAfterLast('b').contains(""))
49 | assert(Some("foot").ops.substringAfterLast('o').contains("t"))
50 | assert("abc".ops.substringAfterLast('a').contains("bc"))
51 | assert("abcba".ops.substringAfterLast('b').contains("a"))
52 | assert("abc".ops.substringAfterLast('c').contains(""))
53 | assert("".ops.substringAfterLast('d').contains(""))
54 | }
55 | ```
56 |
57 | ## What's it
58 |
59 | [Apache Commons Lang](https://commons.apache.org/proper/commons-lang/) provides a host of helper utilities for the
60 | java.lang API, notably String manipulation methods, basic numerical methods, object reflection, concurrency, creation
61 | and serialization and System properties. Additionally it contains basic enhancements to java.util.Date and a series
62 | of utilities dedicated to help with building methods, such as hashCode, toString and equals.
63 |
64 | Commons Lang3 Bridge is a Scala bridge library. It supported use apache commons lang as scala style.
65 |
66 | ## StringUtils
67 |
68 | With Apache Commons StringUtils, we call functions as:
69 |
70 | ```java
71 | public void testDefaultIfEmpty_StringString() {
72 | assertEquals("NULL", StringUtils.defaultIfEmpty(null, "NULL"));
73 | assertEquals("NULL", StringUtils.defaultIfEmpty("", "NULL"));
74 | assertEquals("abc", StringUtils.defaultIfEmpty("abc", "NULL"));
75 | assertNull(StringUtils.getIfEmpty("", null));
76 | // Tests compatibility for the API return type
77 | final String s = StringUtils.defaultIfEmpty("abc", "NULL");
78 | assertEquals("abc", s);
79 | }
80 | ```
81 |
82 | It's strong and power, null safe with all side conditions.
83 |
84 | ### Extensions
85 |
86 | And now, in scala, we add a extern field named `ops` for `String` and `Option[String]` type.
87 | Call the functions like OO style methods:
88 |
89 | ```scala
90 | import org.scalatest.funsuite.AnyFunSuite
91 | // import bridge extensions
92 | import commons.lang3.bridge.StringUtils.ops._
93 | // ...
94 | class StringUtilsSpec extends AnyFunSuite {
95 | // ..
96 | test("test string default if empty with string") {
97 | assert(nullString.ops.defaultIfEmpty("NULL") == "NULL")
98 | assert(Some("").ops.defaultIfEmpty("NULL") == "NULL")
99 | assert("abc".ops.defaultIfEmpty(Some("NULL")) == "abc")
100 | assert("".ops.defaultIfEmpty(null) == null)
101 | // Tests compatibility for the API return type
102 | val s = "abc".ops.defaultIfEmpty("NULL")
103 | assert(s == "abc")
104 | }
105 | }
106 | ```
107 |
108 | ### Null safe and TypeMapping
109 |
110 | All StringUtils functions in Apache Commons Lang3 is null safe. And the bridge bundle it as null and None safe.
111 |
112 | Specifically:
113 | - All functions return String may null that bridged to returns `Option[String]`
114 | - All args accepted a String may null that bridged to accepted `Option[String]` or String.
115 | You can choose any way as you wish. The bridged methods auto handle them!
116 | - When you see a source in document as `none`, It could be a `String` variable as null, or a
117 | `Option[String]` variable as None. In the bridge core, the powerful TypeMapping mechanism
118 | known howto convert it.
119 | - Some functions have varargs typed `String[]`. We bridged them as scala varargs `Seq[(String|Option[String])]*`.
120 | The bridge choice String or `Option[String]` what ever your pass in. But they must all `String`
121 | or all `Option[String]` same. Don't mix difference type in one varargs Seq.
122 | - Some functions have two String parameters. By the bridge you can call them pass etc.
123 | `str.ops.method(String, Option[String])` or `str.ops.method(Option[String], String)` or
124 | what ever combinators. Because the parameters have independents type definitions.
125 | - Some functions are accepted parameters as `CharSequnces`. By bridged you can pass
126 | `CharSequnces` or `Option[CharSequence]` as your wish.
127 |
128 | ### Adt Type Handle
129 |
130 | Many methods in bridge (They have written in `StringCommons.scala` source) with type parameters like:
131 |
132 | ```scala
133 | def removeEnd[R: Adt.Options2[*, String, Option[String]]](rmv: R): Option[String] = {
134 | val rmvStr = mapToStrOpt.input(rmv).orNull
135 | Option(Strings.removeEnd(strOrNull, rmvStr))
136 | }
137 | ```
138 |
139 | The type means a union type `String` or `Option[String]`.
140 |
141 | ### Limit
142 |
143 | Not all functions in StringUtils class were been bridged.
144 |
145 | We skip something like:
146 | - All deprecated functions
147 | - Something like `isNoneBlank`、`isAnyEmpty` and so on. They aren't oo style code
148 | have subject, predicate and objects.
149 | - All join method. Not only isn't OO style but also scala has powerful string function `mkString` .
150 | - Bridge support Union Type definition `(String | Option[String])`,but almost char args
151 | just bundled as `Char`, without `Option[Char]`. Because `Char` is a primitive type.
152 | - Some functions received char args as int type. The bridged bundled it as Char or Int.
153 | You need recognize it in scala.
154 | - In apache commons, when you pass null literal into functions, them returns result safely.
155 | But the bridged methods need now what's type of them. So pass a null `String` or None
156 | `Option[String]` this safe, `null` literal without type is *exception*.
157 |
158 |
159 |
--------------------------------------------------------------------------------
/build.sbt:
--------------------------------------------------------------------------------
1 | val `modules/file` = file(".").getCanonicalFile / "modules"
2 |
3 | val bridge = project in `modules/file` / "bridge"
4 |
5 | bridge / name := "commons-lang3-bridge"
6 |
7 | Global / onChangedBuildSource := ReloadOnSourceChanges
8 |
--------------------------------------------------------------------------------
/modules/bridge/build.sbt:
--------------------------------------------------------------------------------
1 | name := "commons-lang3-bridge"
2 |
3 | libraryDependencies ++= libScalax.`commons-lang3`.value.map(_ % Provided)
4 | libraryDependencies ++= libScalax.scalatest.value.map(_ % Test)
5 | libraryDependencies ++= libScalax.`kind-projector`.value
6 | libraryDependencies ++= libScalax.`simple-adt`.value
7 |
8 | CommonSettings.commonProjectSettings
9 |
--------------------------------------------------------------------------------
/modules/bridge/src/main/scala/commons/lang3/bridge/StringUtils.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | /** 封装 Apache Commons 的字符串工具函数,简化代码
4 | *
5 | * @author
6 | * liuxin
7 | * @version 1.0.0
8 | * @since 2022/08/22
9 | * 18:58
10 | */
11 | object StringUtils {
12 |
13 | object ops {
14 |
15 | import net.scalax.simple.adt.{TypeAdt => Adt}
16 |
17 | implicit class StringOptExt[T: Adt.CoProducts2[*, String, Option[String]]](x: T) {
18 | val ops: StringCommons[T] = new StringCommons(x)
19 | }
20 |
21 | }
22 |
23 | }
24 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsContainsSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import org.scalatest.funsuite.AnyFunSuite
4 |
5 | import java.util.Locale
6 |
7 | /** TODO
8 | *
9 | * @author
10 | * mars
11 | * @version 1.0.0
12 | * @since 2022/08/28
13 | * 01:18
14 | */
15 | class StringUtilsContainsSpec extends AnyFunSuite {
16 | val nullString: String = null
17 | val nullChars: Array[Char] = null
18 | val noneString: Option[String] = None
19 |
20 | import commons.lang3.bridge.StringUtils.ops._
21 |
22 | /** Supplementary character U+20000 See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
23 | */
24 | private val CharU20000 = "\uD840\uDC00"
25 |
26 | /** Supplementary character U+20001 See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
27 | */
28 | private val CharU20001 = "\uD840\uDC01"
29 |
30 | /** Incomplete supplementary character U+20000, high surrogate only. See
31 | * http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
32 | */
33 | private val CharUSuppCharHigh = "\uDC00"
34 |
35 | /** Incomplete supplementary character U+20000, low surrogate only. See
36 | * http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
37 | */
38 | private val CharUSuppCharLow = "\uD840"
39 |
40 | test("test string contains char") {
41 |
42 | assert(!nullString.ops.contains(' '))
43 | assert(!"".ops.contains(' '))
44 |
45 | assert(!"".ops.contains(nullString))
46 | assert(!nullString.ops.contains(nullString))
47 |
48 | assert("abc".ops.contains('a'))
49 | assert("abc".ops.contains('b'))
50 | assert("abc".ops.contains('c'))
51 | assert(!"abc".ops.contains('z'))
52 | }
53 |
54 | test("test option string contains char ") {
55 | assert(!noneString.ops.contains(' '))
56 | assert(!Some("").ops.contains(' '))
57 |
58 | assert(!Some("").ops.contains(None))
59 |
60 | assert(!None.ops.contains(None))
61 |
62 | assert(Some("abc").ops.contains('a'))
63 | assert(Some("abc").ops.contains('b'))
64 | assert(Some("abc").ops.contains('c'))
65 | assert(!Some("abc").ops.contains('z'))
66 |
67 | }
68 |
69 | test("test string contains string") {
70 | assert(!nullString.ops.contains(nullString))
71 | assert(!nullString.ops.contains(""))
72 | assert(!nullString.ops.contains("a"))
73 | assert(!"".ops.contains(nullString))
74 | assert("".ops.contains(""))
75 | assert(!"".ops.contains("a"))
76 | assert("abc".ops.contains("a"))
77 | assert("abc".ops.contains("b"))
78 | assert("abc".ops.contains("c"))
79 | assert("abc".ops.contains(Some("abc")))
80 | assert(!"abc".ops.contains("z"))
81 | }
82 |
83 | test("test Option[string] contains Option[string]") {
84 | val none: Option[String] = None
85 | assert(!none.ops.contains(None))
86 | assert(!none.ops.contains(""))
87 | assert(!none.ops.contains(Some("a")))
88 | assert(!Some("").ops.contains(None))
89 | assert(Some("").ops.contains(Some("")))
90 | assert(!Some("").ops.contains(Some("a")))
91 | assert(Some("abc").ops.contains("a"))
92 | assert(Some("abc").ops.contains(Some("b")))
93 | assert(Some("abc").ops.contains("c"))
94 | assert(Some("abc").ops.contains(Some("abc")))
95 | assert(!Some("abc").ops.contains(Some("z")))
96 | }
97 |
98 | test("test contains String with Bad Supplementary chars") {
99 | assert(!CharUSuppCharHigh.ops.contains(CharU20001))
100 | assert(!CharUSuppCharLow.ops.contains(CharU20001))
101 | assert(!CharU20001.ops.contains(CharUSuppCharHigh))
102 | assert(CharU20001.indexOf(CharUSuppCharLow) == 0)
103 | assert(CharU20001.ops.contains(CharUSuppCharLow))
104 | assert((CharU20001 + CharUSuppCharLow + "a").ops.contains("a"))
105 | assert((CharU20001 + CharUSuppCharHigh + "a").ops.contains("a"))
106 | }
107 |
108 | test("test contains Option[String] with Bad Supplementary chars") {
109 | assert(!Some(CharUSuppCharHigh).ops.contains(Some(CharU20001)))
110 | assert(!Some(CharUSuppCharLow).ops.contains(CharU20001))
111 | assert(!Some(CharU20001).ops.contains(Some(CharUSuppCharHigh)))
112 | assert(CharU20001.indexOf(CharUSuppCharLow) == 0)
113 | assert(Some(CharU20001).ops.contains(CharUSuppCharLow))
114 | assert(Some(CharU20001 + CharUSuppCharLow + "a").ops.contains(Some("a")))
115 | assert(Some(CharU20001 + CharUSuppCharHigh + "a").ops.contains(Some("a")))
116 | }
117 |
118 | test("test contains any string char array") {
119 |
120 | assert(!nullString.ops.containsAny(nullString))
121 | assert(!nullString.ops.containsAny(new Array[Char](0): _*))
122 | assert(!nullString.ops.containsAny('a', 'b'))
123 |
124 | assert(!"".ops.containsAny(nullString))
125 | assert(!"".ops.containsAny(new Array[Char](0): _*))
126 | assert(!"".ops.containsAny('a', 'b'))
127 |
128 | assert(!"zzabyycdxx".ops.containsAny(nullString))
129 | assert(!"zzabyycdxx".ops.containsAny(new Array[Char](0): _*))
130 | assert("zzabyycdxx".ops.containsAny('z', 'a'))
131 | assert("zzabyycdxx".ops.containsAny("b", "y"))
132 | assert("zzabyycdxx".ops.containsAny('z', 'y'))
133 | assert(!"ab".ops.containsAny(new Array[Char]('z'): _*))
134 | }
135 |
136 | test("test option string contains any string char array") {
137 |
138 | assert(!nullString.ops.containsAny(nullString))
139 | assert(!nullString.ops.containsAny(new Array[Char](0): _*))
140 | assert(!nullString.ops.containsAny('a', 'b'))
141 |
142 | assert(!Some("").ops.containsAny(nullString))
143 | assert(!Some("").ops.containsAny(new Array[Char](0): _*))
144 | assert(!Some("").ops.containsAny('a', 'b'))
145 |
146 | assert(!Some("zzabyycdxx").ops.containsAny(nullString))
147 | assert(!Some("zzabyycdxx").ops.containsAny(new Array[Char](0): _*))
148 | assert(Some("zzabyycdxx").ops.containsAny("z", "a"))
149 | assert(Some("zzabyycdxx").ops.containsAny('b', 'y'))
150 | assert(Some("zzabyycdxx").ops.containsAny('z', 'y'))
151 | assert(!Some("ab").ops.containsAny(new Array[Char]('z'): _*))
152 | }
153 |
154 | test("test contains any string or char array with bad supplement chars") {
155 | assert(!CharUSuppCharHigh.ops.containsAny(CharU20001.toCharArray: _*))
156 | assert(!("abc" + CharUSuppCharHigh + "xyz").ops.containsAny(CharU20001.toCharArray: _*))
157 | assert(CharUSuppCharLow.indexOf(CharU20001) == -1)
158 | assert(!Some(CharUSuppCharLow).ops.containsAny(CharU20001.toCharArray: _*))
159 | assert(!CharU20001.ops.containsAny(CharUSuppCharHigh.toCharArray: _*))
160 | assert(CharU20001.indexOf(CharUSuppCharLow) == 0)
161 | assert(Some(CharU20001).ops.containsAny(CharUSuppCharLow.toCharArray: _*))
162 | }
163 |
164 | test("test contains any string or char array with supplement chars") {
165 | assert((CharU20000 + CharU20001).ops.containsAny(CharU20000.toCharArray: _*))
166 | assert(("a" + CharU20000 + CharU20001).ops.containsAny("a".toCharArray: _*))
167 | assert((CharU20000 + "a" + CharU20001).ops.containsAny("a".toCharArray: _*))
168 | assert((CharU20000 + CharU20001 + "a").ops.containsAny("a".toCharArray: _*))
169 | assert(Some(CharU20000 + CharU20001).ops.containsAny(CharU20001.toCharArray: _*))
170 | assert(CharU20000.ops.containsAny(CharU20000.toCharArray: _*))
171 | // Sanity check:
172 | assert(-1 == CharU20000.indexOf(CharU20001))
173 | assert(0 == CharU20000.indexOf(CharU20001.charAt(0)))
174 | assert(-1 == CharU20000.indexOf(CharU20001.charAt(1)))
175 | // Test:
176 | assert(!Some(CharU20000).ops.containsAny(CharU20001.toCharArray: _*))
177 | assert(!CharU20001.ops.containsAny(CharU20000.toCharArray: _*))
178 | }
179 |
180 | test("test string contains any string") {
181 | assert(!nullString.ops.containsAny(nullString))
182 | assert(!nullString.ops.containsAny(""))
183 | assert(!nullString.ops.containsAny("ab"))
184 |
185 | assert(!"".ops.containsAny(nullString))
186 | assert(!"".ops.containsAny(""))
187 | assert(!"".ops.containsAny(""))
188 | assert(!"".ops.containsAny("ab"))
189 |
190 | assert(!"zzabyycdxx".ops.containsAny(nullString))
191 | assert(!"zzabyycdxx".ops.containsAny(""))
192 | assert("zzabyycdxx".ops.containsAny("za"))
193 | assert("zzabyycdxx".ops.containsAny("by"))
194 | assert("zzabyycdxx".ops.containsAny("zy"))
195 | assert(!"ab".ops.containsAny("z"))
196 |
197 | }
198 |
199 | test("test option string contains any string") {
200 | assert(!noneString.ops.containsAny(nullString))
201 | assert(!noneString.ops.containsAny(""))
202 | assert(!noneString.ops.containsAny("ab"))
203 |
204 | assert(!Some("").ops.containsAny(nullString))
205 | assert(!Some("").ops.containsAny(""))
206 | assert(!Some("").ops.containsAny("ab"))
207 |
208 | assert(!Some("zzabyycdxx").ops.containsAny(nullString))
209 | assert(!Some("zzabyycdxx").ops.containsAny(""))
210 | assert(Some("zzabyycdxx").ops.containsAny(Some("za")))
211 | assert(Some("zzabyycdxx").ops.containsAny("by"))
212 | assert(Some("zzabyycdxx").ops.containsAny("zy"))
213 | assert(!Some("ab").ops.containsAny("z"))
214 | }
215 |
216 | test("test string contains any string array") {
217 | assert(!nullString.ops.containsAny(nullString))
218 | assert(!nullString.ops.containsAny(new Array[String](0): _*))
219 | assert(!noneString.ops.containsAny(Array[String]("hello"): _*))
220 | assert(!Some("").ops.containsAny(noneString))
221 | assert(!"".ops.containsAny(new Array[String](0): _*))
222 | assert(!Some("").ops.containsAny(Array[String]("hello"): _*))
223 | assert(!Some("hello, goodbye").ops.containsAny(noneString))
224 | assert(!"hello, goodbye".ops.containsAny(new Array[String](0): _*))
225 | assert("hello, goodbye".ops.containsAny(Array[String]("hello", "goodbye"): _*))
226 | assert(Some("hello, goodbye").ops.containsAny(Array[String]("hello", "Goodbye"): _*))
227 | assert(!"hello, goodbye".ops.containsAny(Array[String]("Hello", "Goodbye"): _*))
228 | assert(!Some("hello, goodbye").ops.containsAny(Array[String]("Hello", null): _*))
229 | assert(!"hello, null".ops.containsAny(Array[String]("Hello", null): _*))
230 | // Javadoc examples:
231 | assert("abcd".ops.containsAny("ab", null))
232 | assert(Some("abcd").ops.containsAny("ab", "cd"))
233 | assert("abc".ops.containsAny("d", "abc"))
234 | }
235 |
236 | test("test string contains any ignore case string array") {
237 | assert(!(nullString.ops.containsAnyIgnoreCase(nullString)))
238 | assert(!nullString.ops.containsAnyIgnoreCase(new Array[String](0): _*))
239 | assert(!noneString.ops.containsAnyIgnoreCase(Array[String]("hello"): _*))
240 | assert(!"".ops.containsAnyIgnoreCase(nullString))
241 | assert(!Some("").ops.containsAnyIgnoreCase(new Array[String](0): _*))
242 | assert(!Some("").ops.containsAnyIgnoreCase(Array[String]("hello"): _*))
243 | assert(!Some("hello, goodbye").ops.containsAnyIgnoreCase(nullString))
244 | assert(!"hello, goodbye".ops.containsAnyIgnoreCase(new Array[String](0): _*))
245 | assert("hello, goodbye".ops.containsAnyIgnoreCase(Array[String]("hello", "goodbye"): _*))
246 | assert("hello, goodbye".ops.containsAnyIgnoreCase(Array[String]("hello", "Goodbye"): _*))
247 | assert(Some("hello, goodbye").ops.containsAnyIgnoreCase(Array[String]("Hello", "Goodbye"): _*))
248 | assert("hello, goodbye".ops.containsAnyIgnoreCase(Array[String]("Hello", null): _*))
249 | assert("hello, null".ops.containsAnyIgnoreCase(Array[String]("Hello", null): _*))
250 | // Javadoc examples:
251 | assert("abcd".ops.containsAnyIgnoreCase("ab", null))
252 | assert(Some("abcd").ops.containsAnyIgnoreCase("ab", "cd"))
253 | assert("abc".ops.containsAnyIgnoreCase("d", "abc"))
254 | }
255 |
256 | test("test string contains any string with bad supplementary chars") {
257 | assert(!CharUSuppCharHigh.ops.containsAny(CharU20001))
258 | assert(-1 == CharUSuppCharLow.indexOf(CharU20001))
259 | assert(!Some(CharUSuppCharLow).ops.containsAny(CharU20001))
260 | assert(!CharU20001.ops.containsAny(CharUSuppCharHigh))
261 | assert(0 == CharU20001.indexOf(CharUSuppCharLow))
262 | assert(CharU20001.ops.containsAnyIgnoreCase(CharUSuppCharLow))
263 | }
264 |
265 | test("test string contains any string with supplementary chars") {
266 | assert(Some(CharU20000 + CharU20001).ops.containsAny(CharU20000))
267 | assert((CharU20000 + CharU20001).ops.containsAny(Some(CharU20001)))
268 | assert(CharU20000.ops.containsAny(CharU20000))
269 | // Sanity check:
270 | assert(-1 == CharU20000.indexOf(CharU20001))
271 | assert(0 == CharU20000.indexOf(CharU20001.charAt(0)))
272 | assert(-1 == CharU20000.indexOf(CharU20001.charAt(1)))
273 | // Test:
274 | assert(!CharU20000.ops.containsAny(CharU20001))
275 | assert(!CharU20001.ops.containsAny(CharU20000))
276 | }
277 |
278 | test("test string contains ignore case locale independence") {
279 | val locales = Array(Locale.ENGLISH, new Locale("tr"), Locale.GERMAN)
280 |
281 | val tdata = Array(Array("i", "I"), Array("I", "i"), Array("\u03C2", "\u03C3"), Array("\u03A3", "\u03C2"), Array("\u03A3", "\u03C3"))
282 |
283 | val fdata = Array(Array("\u00DF", "SS"))
284 |
285 | for (testLocale <- locales) {
286 | Locale.setDefault(testLocale)
287 | for (j <- tdata.indices) {
288 | assert(
289 | tdata(j)(0).ops.containsIgnoreCase(tdata(j)(1)),
290 | Locale.getDefault.toString + ": " + j + " " + tdata(j)(0) + " " + tdata(j)(1)
291 | )
292 | }
293 | for (j <- fdata.indices) {
294 | assert(
295 | !fdata(j)(0).ops.containsIgnoreCase(fdata(j)(1)),
296 | Locale.getDefault.toString + ": " + j + " " + fdata(j)(0) + " " + fdata(j)(1)
297 | )
298 | }
299 | }
300 | }
301 |
302 | test("test string contains ignore case string") {
303 | assert(!nullString.ops.containsIgnoreCase(nullString))
304 |
305 | // Null tests
306 | assert(!noneString.ops.containsIgnoreCase(""))
307 | assert(!noneString.ops.containsIgnoreCase("a"))
308 | assert(!nullString.ops.containsIgnoreCase(Some("abc")))
309 |
310 | assert(!"".ops.containsIgnoreCase(nullString))
311 | assert(!Some("a").ops.containsIgnoreCase(nullString))
312 | assert(!"abc".ops.containsIgnoreCase(noneString))
313 |
314 | // Match len = 0
315 | assert("".ops.containsIgnoreCase(""))
316 | assert(Some("a").ops.containsIgnoreCase(Some("")))
317 | assert("abc".ops.containsIgnoreCase(""))
318 |
319 | // Match len = 1
320 | assert(!"".ops.containsIgnoreCase(Some("a")))
321 | assert(Some("a").ops.containsIgnoreCase("a"))
322 | assert("abc".ops.containsIgnoreCase("a"))
323 | assert(!Some("").ops.containsIgnoreCase("A"))
324 | assert("a".ops.containsIgnoreCase("A"))
325 | assert("abc".ops.containsIgnoreCase("A"))
326 |
327 | // Match len > 1
328 | assert(!"".ops.containsIgnoreCase("abc"))
329 | assert(!"a".ops.containsIgnoreCase(Some("abc")))
330 | assert(Some("xabcz").ops.containsIgnoreCase("abc"))
331 | assert(!"".ops.containsIgnoreCase(Some("ABC")))
332 | assert(!"a".ops.containsIgnoreCase("ABC"))
333 | assert("xabcz".ops.containsIgnoreCase("ABC"))
334 | }
335 |
336 | test("test string contains none char array") {
337 | val str1 = "a"
338 | val str2 = "b"
339 | val str3 = "ab."
340 | val chars1 = Array('b')
341 | val chars2 = Array('.')
342 | val chars3 = Array('c', 'd')
343 | val emptyChars = new Array[Char](0)
344 | val noc: Option[Char] = None
345 |
346 | assert(nullString.ops.containsNone(noc))
347 | assert("".ops.containsNone(noc))
348 | assert(nullString.ops.containsNone(emptyChars: _*))
349 | assert(Some(str1).ops.containsNone(emptyChars: _*))
350 | assert("".ops.containsNone(emptyChars: _*))
351 | assert("".ops.containsNone(chars1: _*))
352 | assert(Some(str1).ops.containsNone(chars1: _*))
353 | assert(str1.ops.containsNone(chars2: _*))
354 | assert(str1.ops.containsNone(chars3: _*))
355 | assert(!str2.ops.containsNone(chars1: _*))
356 | assert(str2.ops.containsNone(chars2: _*))
357 | assert(str2.ops.containsNone(chars3: _*))
358 | assert(!Some(str3).ops.containsNone(chars1: _*))
359 | assert(!str3.ops.containsNone(chars2: _*))
360 | assert(str3.ops.containsNone(chars3: _*))
361 | }
362 |
363 | test("test string contains none of char array with bad supplementary chars") {
364 | assert(CharUSuppCharHigh.ops.containsNone(CharU20001.toCharArray: _*))
365 | assert(-1 == CharUSuppCharLow.indexOf(CharU20001))
366 | assert(CharUSuppCharLow.ops.containsNone(CharU20001.toCharArray: _*))
367 | assert(-1 == CharU20001.indexOf(CharUSuppCharHigh))
368 | assert(Some(CharU20001).ops.containsNone(CharUSuppCharHigh.toCharArray: _*))
369 | assert(0 == CharU20001.indexOf(CharUSuppCharLow))
370 | assert(!CharU20001.ops.containsNone(CharUSuppCharLow.toCharArray.map(Some(_)): _*))
371 | }
372 |
373 | test("test string contains none of char array with supplementary chars") {
374 | assert(!(CharU20000 + CharU20001).ops.containsNone(CharU20000.toCharArray: _*))
375 | assert(!Some(CharU20000 + CharU20001).ops.containsNone(CharU20001.toCharArray: _*))
376 | assert(!CharU20000.ops.containsNone(CharU20000.toCharArray: _*))
377 | // Sanity check:
378 | assert(-1 == CharU20000.indexOf(CharU20001))
379 | assert(0 == CharU20000.indexOf(CharU20001.charAt(0)))
380 | assert(-1 == CharU20000.indexOf(CharU20001.charAt(1)))
381 | // Test:
382 | assert(CharU20000.ops.containsNone(CharU20001.toCharArray: _*))
383 | assert(CharU20001.ops.containsNone(CharU20000.toCharArray.map(Some(_)): _*))
384 | }
385 |
386 | test("test string contains none string") {
387 | val str1 = "a"
388 | val str2 = "b"
389 | val str3 = "ab."
390 | val chars1 = "b"
391 | val chars2 = "."
392 | val chars3 = "cd"
393 | assert(nullString.ops.containsNone(nullString))
394 | assert(Some("").ops.containsNone(nullString))
395 | assert(nullString.ops.containsNone(""))
396 | assert(Some(str1).ops.containsNone(""))
397 | assert(Some("").ops.containsNone(Some("")))
398 | assert("".ops.containsNone(Some(chars1)))
399 | assert(str1.ops.containsNone(chars1))
400 | assert(str1.ops.containsNone(chars2))
401 | assert(str1.ops.containsNone(chars3))
402 | assert(!Some(str2).ops.containsNone(chars1))
403 | assert(Some(str2).ops.containsNone(Some(chars2)))
404 | assert(str2.ops.containsNone(chars3))
405 | assert(!str3.ops.containsNone(chars1))
406 | assert(!str3.ops.containsNone(Some(chars2)))
407 | assert(str3.ops.containsNone(chars3))
408 | }
409 |
410 | test("test string contains none string with bad supplementary chars") {
411 | // Test edge case: 1/2 of a (broken) supplementary char
412 | assert(CharUSuppCharHigh.ops.containsNone(CharU20001))
413 | assert(-1 == CharUSuppCharLow.indexOf(CharU20001))
414 | assert(CharUSuppCharLow.ops.containsNone(Some(CharU20001)))
415 | assert(-1 == CharU20001.indexOf(CharUSuppCharHigh))
416 | assert(Some(CharU20001).ops.containsNone(CharUSuppCharHigh))
417 | assert(0 == CharU20001.indexOf(CharUSuppCharLow))
418 | assert(!CharU20001.ops.containsNone(CharUSuppCharLow))
419 | }
420 |
421 | test("test string contains none string with supplementary chars") {
422 | assert(!(CharU20000 + CharU20001).ops.containsNone(CharU20000))
423 | assert(!Some(CharU20000 + CharU20001).ops.containsNone(Some(CharU20001)))
424 | assert(!CharU20000.ops.containsNone(CharU20000))
425 | // Sanity check:
426 | assert(-1 == CharU20000.indexOf(CharU20001))
427 | assert(0 == CharU20000.indexOf(CharU20001.charAt(0)))
428 | assert(-1 == CharU20000.indexOf(CharU20001.charAt(1)))
429 | // Test:
430 | assert(CharU20000.ops.containsNone(CharU20001))
431 | assert(CharU20001.ops.containsNone(CharU20000))
432 | }
433 |
434 | test("test string contains only char array") {
435 | val str1 = "a"
436 | val str2 = "b"
437 | val str3 = "ab"
438 | val chars1 = Array('b')
439 | val chars2 = Array('a')
440 | val chars3 = Array('a', 'b')
441 | val emptyChars = new Array[Char](0)
442 | assert(!nullString.ops.containsOnly(noneString))
443 | assert(!Some("").ops.containsOnly(nullString))
444 | assert(!nullString.ops.containsOnly(emptyChars: _*))
445 | assert(!str1.ops.containsOnly(emptyChars: _*))
446 | assert(Some("").ops.containsOnly(emptyChars: _*))
447 | assert("".ops.containsOnly(chars1: _*))
448 | assert(!Some(str1).ops.containsOnly(chars1: _*))
449 | assert(str1.ops.containsOnly(chars2: _*))
450 | assert(str1.ops.containsOnly(chars3: _*))
451 | assert(str2.ops.containsOnly(chars1: _*))
452 | assert(!Some(str2).ops.containsOnly(chars2.map(Option(_)): _*))
453 | assert(str2.ops.containsOnly(chars3.map(Option(_)): _*))
454 | assert(!str3.ops.containsOnly(chars1: _*))
455 | assert(!str3.ops.containsOnly(chars2: _*))
456 | assert(str3.ops.containsOnly(chars3: _*))
457 | }
458 |
459 | test("test string contains only string") {
460 | val str1 = "a"
461 | val str2 = "b"
462 | val str3 = "ab"
463 | val chars1 = "b"
464 | val chars2 = "a"
465 | val chars3 = "ab"
466 | assert(!noneString.ops.containsOnly(noneString))
467 | assert(!Some("").ops.containsOnly(nullString))
468 | assert(!noneString.ops.containsOnly(""))
469 | assert(!Some(str1).ops.containsOnly(Some("")))
470 | assert("".ops.containsOnly(""))
471 | assert("".ops.containsOnly(chars1))
472 | assert(!str1.ops.containsOnly(Some(chars1)))
473 | assert(str1.ops.containsOnly(chars2))
474 | assert(str1.ops.containsOnly(chars3))
475 | assert(str2.ops.containsOnly(chars1))
476 | assert(!str2.ops.containsOnly(chars2))
477 | assert(str2.ops.containsOnly(chars3))
478 | assert(!str3.ops.containsOnly(chars1))
479 | assert(!Some(str3).ops.containsOnly(Some(chars2)))
480 | assert(str3.ops.containsOnly(chars3))
481 | }
482 |
483 | test("test string contains whitespace") {
484 | assert(!"".ops.containsWhitespace)
485 | assert(Some(" ").ops.containsWhitespace)
486 | assert(!"a".ops.containsWhitespace)
487 | assert("a ".ops.containsWhitespace)
488 | assert(" a".ops.containsWhitespace)
489 | assert(Some("a\t").ops.containsWhitespace)
490 | assert("\n".ops.containsWhitespace)
491 | }
492 | }
493 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsEqualsIndexOfSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops._
4 | import org.scalatest.funsuite.AnyFunSuite
5 |
6 | import java.lang
7 | import java.nio.CharBuffer
8 |
9 | /** TODO
10 | *
11 | * @author
12 | * mars
13 | * @version 1.0.0
14 | * @since 2022/09/10
15 | * 21:25
16 | */
17 | class StringUtilsEqualsIndexOfSpec extends AnyFunSuite {
18 | import StringUtilsSpec.{noneString, nullString}
19 |
20 | private val BAR = "bar"
21 |
22 | /** Supplementary character U+20000 See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
23 | */
24 | private val CharU20000 = "\uD840\uDC00"
25 |
26 | /** Supplementary character U+20001 See http://www.oracle.com/technetwork/articles/javase/supplementary-142654.html
27 | */
28 | private val CharU20001 = "\uD840\uDC01"
29 |
30 | private val FOO = "foo"
31 |
32 | private val FOOBAR = "foobar"
33 |
34 | private val FOOBAR_SUB_ARRAY = Array[String]("ob", "ba")
35 |
36 | test("string index of") {
37 | assert(noneString.ops.indexOf(nullString) == -1)
38 | assert("".ops.indexOf(' ') == -1)
39 | assert("aabaabaa".ops.indexOf('a') == 0)
40 | assert("aabaabaa".ops.indexOf('b') == 2)
41 | }
42 |
43 | import org.apache.commons.lang3.{StringUtils => Strings}
44 | test("test string index of char start index") {
45 | assert(-1 == noneString.ops.indexOf(' ', 0))
46 | assert(-1 == nullString.ops.indexOf(' ', -1))
47 | assert(-1 == "".ops.indexOf(' ', 0))
48 | assert(-1 == Some("").ops.indexOf(' ', -1))
49 | assert(0 == "aabaabaa".ops.indexOf('a', 0))
50 | assert(2 == "aabaabaa".ops.indexOf('b', 0))
51 | assert(5 == "aabaabaa".ops.indexOf('b', 3))
52 | assert(-1 == "aabaabaa".ops.indexOf('b', 9))
53 | assert(2 == "aabaabaa".ops.indexOf('b', -1))
54 | }
55 |
56 | test("test string index of string") {
57 | assert(-1 == noneString.ops.indexOf(nullString))
58 | assert(-1 == "".ops.indexOf(noneString))
59 | assert(0 == Some("").ops.indexOf(""))
60 | assert(0 == Some("aabaabaa").ops.indexOf("a"))
61 | assert(2 == "aabaabaa".ops.indexOf(Some("b")))
62 | assert(1 == "aabaabaa".ops.indexOf("ab"))
63 | assert(0 == "aabaabaa".ops.indexOf(""))
64 | }
65 |
66 | test("test string index of string and start position") {
67 | assert(-1 == nullString.ops.indexOf(noneString, 0))
68 | assert(-1 == noneString.ops.indexOf(nullString, -1))
69 | assert(-1 == nullString.ops.indexOf("", 0))
70 | assert(-1 == nullString.ops.indexOf("", -1))
71 | assert(-1 == Some("").ops.indexOf(nullString, 0))
72 | assert(-1 == "".ops.indexOf(nullString, -1))
73 | assert(0 == "".ops.indexOf("", 0))
74 | assert(0 == "".ops.indexOf("", -1))
75 | assert(0 == Some("").ops.indexOf("", 9))
76 | assert(0 == "abc".ops.indexOf(Some(""), 0))
77 | assert(0 == "abc".ops.indexOf("", -1))
78 | assert(3 == "abc".ops.indexOf("", 9))
79 | assert(3 == "abc".ops.indexOf("", 3))
80 | assert(0 == "aabaabaa".ops.indexOf("a", 0))
81 | assert(2 == "aabaabaa".ops.indexOf("b", 0))
82 | assert(1 == "aabaabaa".ops.indexOf("ab", 0))
83 | assert(5 == "aabaabaa".ops.indexOf("b", 3))
84 | assert(-1 == "aabaabaa".ops.indexOf("b", 9))
85 | assert(2 == "aabaabaa".ops.indexOf("b", -1))
86 | assert(2 == "aabaabaa".ops.indexOf(Some(""), 2))
87 |
88 | // Test that startIndex works correctly, i.e. cannot match before startIndex
89 | assert(7 == "12345678".ops.indexOf("8", 5))
90 | assert(7 == "12345678".ops.indexOf(Some("8"), 6))
91 | assert(7 == "12345678".ops.indexOf("8", 7)) // 7 is last index
92 |
93 | assert(-1 == Some("12345678").ops.indexOf("8", 8))
94 |
95 | }
96 |
97 | test("test string index of any char") {
98 | assert(-1 == noneString.ops.indexOfAny(null.asInstanceOf[Array[Char]]: _*))
99 | assert(-1 == noneString.ops.indexOfAny(new Array[Char](0): _*))
100 | assert(-1 == nullString.ops.indexOfAny('a', 'b'))
101 |
102 | assert(-1 == "".ops.indexOfAny(null.asInstanceOf[Array[Char]]: _*))
103 | assert(-1 == "".ops.indexOfAny(new Array[Char](0): _*))
104 | assert(-1 == Some("").ops.indexOfAny('a', 'b'))
105 |
106 | assert(-1 == "zzabyycdxx".ops.indexOfAny(null.asInstanceOf[Array[Char]]: _*))
107 | assert(-1 == Some("zzabyycdxx").ops.indexOfAny(new Array[Char](0): _*))
108 | assert(0 == "zzabyycdxx".ops.indexOfAny('z', 'a'))
109 | assert(3 == "zzabyycdxx".ops.indexOfAny('b', 'y'))
110 | assert(-1 == "ab".ops.indexOfAny('z'))
111 | }
112 |
113 | test("test string index of any chars with supplementary chars") {
114 | assert(0 == (CharU20000 + CharU20001).ops.indexOfAny(CharU20000.toCharArray: _*))
115 | assert(2 == Some(CharU20000 + CharU20001).ops.indexOfAny(CharU20001.toCharArray: _*))
116 | assert(0 == CharU20000.ops.indexOfAny(CharU20000.toCharArray: _*))
117 | assert(-1 == CharU20000.ops.indexOfAny(CharU20001.toCharArray: _*))
118 | }
119 |
120 | test("test string index of any bug string") {
121 | assert(-1 == nullString.ops.indexOfAnyBut(nullString))
122 | assert(-1 == noneString.ops.indexOfAnyBut(""))
123 | assert(-1 == nullString.ops.indexOfAnyBut(Some("ab")))
124 |
125 | assert(-1 == Some("").ops.indexOfAnyBut(noneString))
126 | assert(-1 == "".ops.indexOfAnyBut(""))
127 | assert(-1 == "".ops.indexOfAnyBut(Some("ab")))
128 |
129 | assert(-1 == "zzabyycdxx".ops.indexOfAnyBut(noneString))
130 | assert(-1 == Some("zzabyycdxx").ops.indexOfAnyBut(""))
131 | assert(3 == "zzabyycdxx".ops.indexOfAnyBut("za"))
132 | assert(0 == "zzabyycdxx".ops.indexOfAnyBut(Some("by")))
133 | assert(0 == "ab".ops.indexOfAnyBut("z"))
134 | }
135 |
136 | test("test string index of any but string with supplement chars") {
137 | assert(2 == Some(CharU20000 + CharU20001).ops.indexOfAnyBut(CharU20000))
138 | assert(0 == (CharU20000 + CharU20001).ops.indexOfAnyBut(Some(CharU20001)))
139 | assert(-1 == CharU20000.ops.indexOfAnyBut(CharU20000))
140 | assert(0 == CharU20000.ops.indexOfAnyBut(CharU20001))
141 | }
142 |
143 | test("test string index of ignore case") {
144 | assert(-1 == noneString.ops.indexOfIgnoreCase(nullString))
145 | assert(-1 == nullString.ops.indexOfIgnoreCase(Some("")))
146 | assert(-1 == "".ops.indexOfIgnoreCase(noneString))
147 | assert(0 == Some("").ops.indexOfIgnoreCase(""))
148 | assert(0 == "aabaabaa".ops.indexOfIgnoreCase("a"))
149 | assert(0 == "aabaabaa".ops.indexOfIgnoreCase("A"))
150 | assert(2 == Some("aabaabaa").ops.indexOfIgnoreCase("b"))
151 | assert(2 == "aabaabaa".ops.indexOfIgnoreCase("B"))
152 | assert(1 == "aabaabaa".ops.indexOfIgnoreCase(Some("ab")))
153 | assert(1 == "aabaabaa".ops.indexOfIgnoreCase("AB"))
154 | assert(0 == "aabaabaa".ops.indexOfIgnoreCase(""))
155 | }
156 |
157 | test("test string index of ignore case with start position") {
158 | assert(1 == "aabaabaa".ops.indexOfIgnoreCase("AB", -1))
159 | assert(1 == Some("aabaabaa").ops.indexOfIgnoreCase("AB", 0))
160 | assert(1 == "aabaabaa".ops.indexOfIgnoreCase("AB", 1))
161 | assert(4 == "aabaabaa".ops.indexOfIgnoreCase("AB", 2))
162 | assert(4 == "aabaabaa".ops.indexOfIgnoreCase(Some("AB"), 3))
163 | assert(4 == "aabaabaa".ops.indexOfIgnoreCase("AB", 4))
164 | assert(-1 == "aabaabaa".ops.indexOfIgnoreCase("AB", 5))
165 | assert(-1 == "aabaabaa".ops.indexOfIgnoreCase("AB", 6))
166 | assert(-1 == ("aabaabaa").ops.indexOfIgnoreCase("AB", 7))
167 | assert(-1 == "aabaabaa".ops.indexOfIgnoreCase("AB", 8))
168 | assert(1 == "aab".ops.indexOfIgnoreCase("AB", 1))
169 | assert(5 == "aabaabaa".ops.indexOfIgnoreCase("", 5))
170 | assert(-1 == "ab".ops.indexOfIgnoreCase("AAB", 0))
171 | assert(-1 == "aab".ops.indexOfIgnoreCase("AAB", 1))
172 | assert(-1 == "abc".ops.indexOfIgnoreCase("", 9))
173 | }
174 |
175 | test("test string last index of char") {
176 | assert(-1 == noneString.ops.lastIndexOf(' '))
177 | assert(-1 == Some("").ops.lastIndexOf(' '))
178 | assert(7 == "aabaabaa".ops.lastIndexOf('a'))
179 | assert(5 == Some("aabaabaa").ops.lastIndexOf('b'))
180 | }
181 |
182 | test("test string last index of char from start position") {
183 | assert(-1 == noneString.ops.lastIndexOf(' ', 0))
184 | assert(-1 == nullString.ops.lastIndexOf(' ', -1))
185 | assert(-1 == "".ops.lastIndexOf(' ', 0))
186 | assert(-1 == Some("").ops.lastIndexOf(' ', -1))
187 | assert(7 == "aabaabaa".ops.lastIndexOf('a', 8))
188 | assert(5 == "aabaabaa".ops.lastIndexOf('b', 8))
189 | assert(2 == "aabaabaa".ops.lastIndexOf('b', 3))
190 | assert(5 == Some("aabaabaa").ops.lastIndexOf('b', 9))
191 | assert(-1 == "aabaabaa".ops.lastIndexOf('b', -1))
192 | assert(0 == "aabaabaa".ops.lastIndexOf('a', 0))
193 |
194 | // LANG-1300 addition test
195 | val CODE_POINT = 0x2070e
196 | var builder: java.lang.StringBuilder = new lang.StringBuilder
197 | builder.appendCodePoint(CODE_POINT)
198 | assert(0 == builder.toString.ops.lastIndexOf(CODE_POINT, 0))
199 | builder.appendCodePoint(CODE_POINT)
200 | assert(0 == builder.toString.ops.lastIndexOf(CODE_POINT, 0))
201 | assert(0 == builder.toString.ops.lastIndexOf(CODE_POINT, 1))
202 | assert(2 == builder.toString.ops.lastIndexOf(CODE_POINT, 2))
203 |
204 | builder.append("aaaaa")
205 | assert(2 == builder.toString.ops.lastIndexOf(CODE_POINT, 4))
206 | // inner branch on the supplementary character block
207 | val tmp: Array[Char] = Array(55361.toChar)
208 | builder = new lang.StringBuilder()
209 | builder.append(tmp)
210 | assert(-1 == builder.toString.ops.lastIndexOf(CODE_POINT, 0))
211 | builder.appendCodePoint(CODE_POINT)
212 | assert(-1 == builder.toString.ops.lastIndexOf(CODE_POINT, 0))
213 | assert(1 == builder.toString.ops.lastIndexOf(CODE_POINT, 1))
214 | assert(-1 == builder.toString.ops.lastIndexOf(CODE_POINT, 0))
215 | assert(1 == builder.toString.ops.lastIndexOf(CODE_POINT, 1))
216 | assert(-1 == CharBuffer.wrap("[%{.c.0rro").toString.ops.lastIndexOf(-1738.toChar, 982))
217 |
218 | }
219 |
220 | test("test string last index of string") {
221 | assert(-1 == noneString.ops.lastIndexOf(nullString))
222 | assert(-1 == "".ops.lastIndexOf(noneString))
223 | assert(-1 == "".ops.lastIndexOf("a"))
224 | assert(0 == Some("").ops.lastIndexOf(""))
225 | assert(8 == "aabaabaa".ops.lastIndexOf(""))
226 | assert(7 == "aabaabaa".ops.lastIndexOf(Some("a")))
227 | assert(5 == "aabaabaa".ops.lastIndexOf("b"))
228 | assert(4 == "aabaabaa".ops.lastIndexOf("ab"))
229 |
230 | }
231 |
232 | test("test last index of string with start position") {
233 | assert(-1 == noneString.ops.lastIndexOf(nullString, 0))
234 | assert(-1 == nullString.ops.lastIndexOf(noneString, -1))
235 | assert(-1 == noneString.ops.lastIndexOf("", 0))
236 | assert(-1 == nullString.ops.lastIndexOf(Some(""), -1))
237 | assert(-1 == "".ops.lastIndexOf(nullString, 0))
238 | assert(-1 == "".ops.lastIndexOf(noneString, -1))
239 | assert(0 == Some("").ops.lastIndexOf(Some(""), 0))
240 | assert(-1 == "".ops.lastIndexOf("", -1))
241 | assert(0 == "".ops.lastIndexOf("", 9))
242 | assert(0 == "abc".ops.lastIndexOf("", 0))
243 | assert(-1 == "abc".ops.lastIndexOf("", -1))
244 | assert(3 == "abc".ops.lastIndexOf("", 9))
245 | assert(7 == "aabaabaa".ops.lastIndexOf("a", 8))
246 | assert(5 == "aabaabaa".ops.lastIndexOf("b", 8))
247 | assert(4 == "aabaabaa".ops.lastIndexOf("ab", 8))
248 | assert(2 == "aabaabaa".ops.lastIndexOf("b", 3))
249 | assert(5 == "aabaabaa".ops.lastIndexOf("b", 9))
250 | assert(-1 == "aabaabaa".ops.lastIndexOf("b", -1))
251 | assert(-1 == "aabaabaa".ops.lastIndexOf("b", 0))
252 | assert(0 == "aabaabaa".ops.lastIndexOf("a", 0))
253 | assert(-1 == "aabaabaa".ops.lastIndexOf("a", -1))
254 |
255 | // Test that fromIndex works correctly, i.e. cannot match after fromIndex
256 | assert(7 == Some("12345678").ops.lastIndexOf("8", 9))
257 | assert(7 == "12345678".ops.lastIndexOf("8", 8))
258 | assert(7 == "12345678".ops.lastIndexOf("8", 7)) // 7 is last index
259 |
260 | assert(-1 == "12345678".ops.lastIndexOf("8", 6))
261 |
262 | assert(-1 == "aabaabaa".ops.lastIndexOf("b", 1))
263 | assert(2 == "aabaabaa".ops.lastIndexOf("b", 2))
264 | assert(2 == "aabaabaa".ops.lastIndexOf(Some("ba"), 2))
265 | assert(2 == "aabaabaa".ops.lastIndexOf("ba", 3))
266 |
267 | }
268 |
269 | test("test string last index of any strings") {
270 | assert(-1 == noneString.ops.lastIndexOfAny(null.asInstanceOf[CharSequence])) // test both types of ...
271 |
272 | assert(-1 == noneString.ops.lastIndexOfAny(null.asInstanceOf[Array[CharSequence]]: _*)) // ... varargs invocation
273 |
274 | assert(-1 == noneString.ops.lastIndexOfAny(FOOBAR_SUB_ARRAY: _*))
275 | assert(-1 == FOOBAR.ops.lastIndexOfAny(null.asInstanceOf[CharSequence]))
276 | assert(-1 == Some(FOOBAR).ops.lastIndexOfAny(null.asInstanceOf[Array[CharSequence]]: _*))
277 |
278 | assert(3 == FOOBAR.ops.lastIndexOfAny(FOOBAR_SUB_ARRAY: _*))
279 | assert(-1 == FOOBAR.ops.lastIndexOfAny(new Array[String](0): _*))
280 | assert(-1 == noneString.ops.lastIndexOfAny(new Array[String](0): _*))
281 | assert(-1 == Some("").ops.lastIndexOfAny(new Array[Option[String]](0): _*))
282 | assert(-1 == FOOBAR.ops.lastIndexOfAny(Array[String]("llll"): _*))
283 | assert(6 == FOOBAR.ops.lastIndexOfAny(Array[String](""): _*))
284 | assert(0 == "".ops.lastIndexOfAny(Array[String](""): _*))
285 | assert(-1 == "".ops.lastIndexOfAny(Array[String]("a"): _*))
286 | assert(-1 == "".ops.lastIndexOfAny(Array[String](null): _*))
287 | assert(-1 == FOOBAR.ops.lastIndexOfAny(Array[String](null): _*))
288 | assert(-1 == noneString.ops.lastIndexOfAny(Array[String](null): _*))
289 | }
290 |
291 | test("test string last index of ignore case") {
292 | assert(-1 == noneString.ops.lastIndexOfIgnoreCase(nullString))
293 | assert(-1 == Some("").ops.lastIndexOfIgnoreCase(noneString))
294 | assert(-1 == nullString.ops.lastIndexOfIgnoreCase(""))
295 | assert(-1 == "".ops.lastIndexOfIgnoreCase(Some("a")))
296 | assert(0 == "".ops.lastIndexOfIgnoreCase(""))
297 | assert(8 == "aabaabaa".ops.lastIndexOfIgnoreCase(""))
298 | assert(7 == "aabaabaa".ops.lastIndexOfIgnoreCase("a"))
299 | assert(7 == "aabaabaa".ops.lastIndexOfIgnoreCase("A"))
300 | assert(5 == "aabaabaa".ops.lastIndexOfIgnoreCase("b"))
301 | assert(5 == "aabaabaa".ops.lastIndexOfIgnoreCase("B"))
302 | assert(4 == "aabaabaa".ops.lastIndexOfIgnoreCase("ab"))
303 | assert(4 == "aabaabaa".ops.lastIndexOfIgnoreCase("AB"))
304 | assert(-1 == "ab".ops.lastIndexOfIgnoreCase("AAB"))
305 | assert(0 == "aab".ops.lastIndexOfIgnoreCase("AAB"))
306 | }
307 |
308 | test("test string last index of ignore case with start position") {
309 | assert(-1 == nullString.ops.lastIndexOfIgnoreCase(nullString, 0))
310 | assert(-1 == noneString.ops.lastIndexOfIgnoreCase(noneString, -1))
311 | assert(-1 == nullString.ops.lastIndexOfIgnoreCase("", 0))
312 | assert(-1 == nullString.ops.lastIndexOfIgnoreCase(Some(""), -1))
313 | assert(-1 == "".ops.lastIndexOfIgnoreCase(noneString, 0))
314 | assert(-1 == "".ops.lastIndexOfIgnoreCase(nullString, -1))
315 | assert(0 == Some("").ops.lastIndexOfIgnoreCase("", 0))
316 | assert(-1 == Some("").ops.lastIndexOfIgnoreCase("", -1))
317 | assert(0 == "".ops.lastIndexOfIgnoreCase(Some(""), 9))
318 | assert(0 == "abc".ops.lastIndexOfIgnoreCase("", 0))
319 | assert(-1 == "abc".ops.lastIndexOfIgnoreCase("", -1))
320 | assert(3 == "abc".ops.lastIndexOfIgnoreCase("", 9))
321 | assert(7 == "aabaabaa".ops.lastIndexOfIgnoreCase("A", 8))
322 | assert(5 == "aabaabaa".ops.lastIndexOfIgnoreCase("B", 8))
323 | assert(4 == "aabaabaa".ops.lastIndexOfIgnoreCase("AB", 8))
324 | assert(2 == "aabaabaa".ops.lastIndexOfIgnoreCase("B", 3))
325 | assert(5 == "aabaabaa".ops.lastIndexOfIgnoreCase("B", 9))
326 | assert(-1 == "aabaabaa".ops.lastIndexOfIgnoreCase("B", -1))
327 | assert(-1 == "aabaabaa".ops.lastIndexOfIgnoreCase("B", 0))
328 | assert(0 == "aabaabaa".ops.lastIndexOfIgnoreCase("A", 0))
329 | assert(1 == "aab".ops.lastIndexOfIgnoreCase("AB", 1))
330 | }
331 |
332 | test("test last ordinal index of") {
333 | assert(-1 == noneString.ops.lastOrdinalIndexOf("*", 42))
334 | assert(-1 == Some("*").ops.lastOrdinalIndexOf(nullString, 42))
335 | assert(0 == "".ops.lastOrdinalIndexOf("", 42))
336 | assert(7 == "aabaabaa".ops.lastOrdinalIndexOf("a", 1))
337 | assert(6 == "aabaabaa".ops.lastOrdinalIndexOf("a", 2))
338 | assert(5 == Some("aabaabaa").ops.lastOrdinalIndexOf("b", 1))
339 | assert(2 == "aabaabaa".ops.lastOrdinalIndexOf("b", 2))
340 | assert(4 == "aabaabaa".ops.lastOrdinalIndexOf(Some("ab"), 1))
341 | assert(1 == "aabaabaa".ops.lastOrdinalIndexOf("ab", 2))
342 | assert(8 == "aabaabaa".ops.lastOrdinalIndexOf("", 1))
343 | assert(8 == "aabaabaa".ops.lastOrdinalIndexOf("", 2))
344 | }
345 |
346 | test("test ordinal index of") {
347 | assert(-1 == nullString.ops.ordinalIndexOf(noneString, Integer.MIN_VALUE))
348 | assert(-1 == "".ops.ordinalIndexOf(nullString, Integer.MIN_VALUE))
349 | assert(-1 == "".ops.ordinalIndexOf("", Integer.MIN_VALUE))
350 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("a", Integer.MIN_VALUE))
351 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("b", Integer.MIN_VALUE))
352 | assert(-1 == Some("aabaabaa").ops.ordinalIndexOf("ab", Integer.MIN_VALUE))
353 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("", Integer.MIN_VALUE))
354 |
355 | assert(-1 == noneString.ops.ordinalIndexOf(nullString, -1))
356 | assert(-1 == "".ops.ordinalIndexOf(noneString, -1))
357 | assert(-1 == "".ops.ordinalIndexOf("", -1))
358 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("a", -1))
359 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("b", -1))
360 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("ab", -1))
361 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("", -1))
362 |
363 | assert(-1 == nullString.ops.ordinalIndexOf(nullString, 0))
364 | assert(-1 == "".ops.ordinalIndexOf(noneString, 0))
365 | assert(-1 == "".ops.ordinalIndexOf("", 0))
366 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("a", 0))
367 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("b", 0))
368 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("ab", 0))
369 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("", 0))
370 |
371 | assert(-1 == nullString.ops.ordinalIndexOf(nullString, 1))
372 | assert(-1 == "".ops.ordinalIndexOf(noneString, 1))
373 | assert(0 == "".ops.ordinalIndexOf("", 1))
374 | assert(0 == "aabaabaa".ops.ordinalIndexOf("a", 1))
375 | assert(2 == "aabaabaa".ops.ordinalIndexOf("b", 1))
376 | assert(1 == "aabaabaa".ops.ordinalIndexOf("ab", 1))
377 | assert(0 == "aabaabaa".ops.ordinalIndexOf("", 1))
378 |
379 | assert(-1 == nullString.ops.ordinalIndexOf(noneString, 2))
380 | assert(-1 == "".ops.ordinalIndexOf(nullString, 2))
381 | assert(0 == "".ops.ordinalIndexOf(Some(""), 2))
382 | assert(1 == "aabaabaa".ops.ordinalIndexOf("a", 2))
383 | assert(5 == "aabaabaa".ops.ordinalIndexOf("b", 2))
384 | assert(4 == "aabaabaa".ops.ordinalIndexOf("ab", 2))
385 | assert(0 == "aabaabaa".ops.ordinalIndexOf("", 2))
386 |
387 | assert(-1 == noneString.ops.ordinalIndexOf(noneString, Integer.MAX_VALUE))
388 | assert(-1 == "".ops.ordinalIndexOf(nullString, Integer.MAX_VALUE))
389 | assert(0 == "".ops.ordinalIndexOf("", Integer.MAX_VALUE))
390 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("a", Integer.MAX_VALUE))
391 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("b", Integer.MAX_VALUE))
392 | assert(-1 == "aabaabaa".ops.ordinalIndexOf("ab", Integer.MAX_VALUE))
393 | assert(0 == "aabaabaa".ops.ordinalIndexOf("", Integer.MAX_VALUE))
394 |
395 | assert(-1 == "aaaaaaaaa".ops.ordinalIndexOf("a", 0))
396 | assert(0 == "aaaaaaaaa".ops.ordinalIndexOf("a", 1))
397 | assert(1 == "aaaaaaaaa".ops.ordinalIndexOf("a", 2))
398 | assert(2 == "aaaaaaaaa".ops.ordinalIndexOf("a", 3))
399 | assert(3 == "aaaaaaaaa".ops.ordinalIndexOf("a", 4))
400 | assert(4 == "aaaaaaaaa".ops.ordinalIndexOf("a", 5))
401 | assert(5 == "aaaaaaaaa".ops.ordinalIndexOf("a", 6))
402 | assert(6 == Some("aaaaaaaaa").ops.ordinalIndexOf(Some("a"), 7))
403 | assert(7 == "aaaaaaaaa".ops.ordinalIndexOf("a", 8))
404 | assert(8 == "aaaaaaaaa".ops.ordinalIndexOf("a", 9))
405 | assert(-1 == "aaaaaaaaa".ops.ordinalIndexOf("a", 10))
406 |
407 | // match at each possible position
408 | assert(0 == "aaaaaa".ops.ordinalIndexOf("aa", 1))
409 | assert(1 == "aaaaaa".ops.ordinalIndexOf("aa", 2))
410 | assert(2 == Some("aaaaaa").ops.ordinalIndexOf("aa", 3))
411 | assert(3 == "aaaaaa".ops.ordinalIndexOf("aa", 4))
412 | assert(4 == "aaaaaa".ops.ordinalIndexOf("aa", 5))
413 | assert(-1 == "aaaaaa".ops.ordinalIndexOf("aa", 6))
414 |
415 | assert(0 == "ababab".ops.ordinalIndexOf("aba", 1))
416 | assert(2 == "ababab".ops.ordinalIndexOf(Some("aba"), 2))
417 | assert(-1 == "ababab".ops.ordinalIndexOf("aba", 3))
418 |
419 | assert(0 == "abababab".ops.ordinalIndexOf("abab", 1))
420 | assert(2 == "abababab".ops.ordinalIndexOf("abab", 2))
421 | assert(4 == "abababab".ops.ordinalIndexOf("abab", 3))
422 | assert(-1 == "abababab".ops.ordinalIndexOf("abab", 4))
423 | }
424 |
425 | test("test lang 1193") {
426 | assert(0 == "abc".ops.ordinalIndexOf("ab", 1))
427 | }
428 |
429 | test("test lang 1241 1") {
430 | assert(0 == "abaabaab".ops.ordinalIndexOf("ab", 1))
431 | assert(3 == "abaabaab".ops.ordinalIndexOf("ab", 2))
432 | assert(6 == "abaabaab".ops.ordinalIndexOf("ab", 3))
433 | }
434 |
435 | test("test lang 1241 2") {
436 | // 0 2 4
437 | assert(0 == "abababa".ops.ordinalIndexOf("aba", 1))
438 | assert(2 == "abababa".ops.ordinalIndexOf("aba", 2))
439 | assert(4 == "abababa".ops.ordinalIndexOf("aba", 3))
440 | assert(0 == "abababab".ops.ordinalIndexOf("abab", 1))
441 | assert(2 == "abababab".ops.ordinalIndexOf("abab", 2))
442 | assert(4 == "abababab".ops.ordinalIndexOf("abab", 3))
443 | }
444 | }
445 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsIEmptyBlankSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops._
4 | import org.scalatest.funsuite.AnyFunSuite
5 |
6 | /** TODO
7 | *
8 | * @author
9 | * mars
10 | * @version 1.0.0
11 | * @since 2022/09/10
12 | * 16:26
13 | */
14 | class StringUtilsIEmptyBlankSpec extends AnyFunSuite {
15 | val noneString: Option[String] = None
16 | val nullString: String = null
17 | val noneStrings: Option[Array[String]] = None
18 |
19 | test("test string is empty") {
20 | assert(nullString.ops.isEmpty)
21 | assert("".ops.isEmpty)
22 | assert(!Some(" ").ops.isEmpty)
23 | assert(!"foo".ops.isEmpty)
24 | assert(!" foo ".ops.isEmpty)
25 | }
26 |
27 | test("test string is not empty") {
28 | assert(!nullString.ops.isNotEmpty)
29 | assert(!"".ops.isNotEmpty)
30 | assert(" ".ops.isNotEmpty)
31 | assert("foo".ops.isNotEmpty)
32 | assert(" foo ".ops.isNotEmpty)
33 | }
34 |
35 | test("test string is blank") {
36 | assert(noneString.ops.isBlank)
37 | assert("".ops.isBlank)
38 | assert(StringUtilsSpec.WHITESPACE.ops.isBlank)
39 | assert(!"foo".ops.isBlank)
40 | assert(!Some(" foo ").ops.isBlank)
41 | }
42 |
43 | test("test string is not blank") {
44 | assert(!noneString.ops.isNotBlank)
45 | assert(!"".ops.isNotBlank)
46 | assert(!Some(StringUtilsSpec.WHITESPACE).ops.isNotBlank)
47 | assert("foo".ops.isNotBlank)
48 | assert(" foo ".ops.isNotBlank)
49 | }
50 |
51 | }
52 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops._
4 | import org.apache.commons.lang3.mutable.MutableInt
5 | import org.apache.commons.lang3.{ArrayUtils, CharUtils, StringUtils => Strings}
6 | import org.scalatest.funsuite.AnyFunSuite
7 |
8 | import java.nio.CharBuffer
9 | import java.nio.charset.StandardCharsets
10 | import java.util
11 | import java.util.function.Supplier
12 | import java.util.{Collections, Locale, Objects}
13 | import scala.collection.mutable
14 |
15 | /** TODO
16 | *
17 | * @author
18 | * mars
19 | * @version 1.0.0
20 | * @since 2022/09/01
21 | * 00:53
22 | */
23 | class StringUtilsSpec extends AnyFunSuite {
24 | import StringUtilsSpec._
25 |
26 | private def assertAbbreviateWithAbbrevMarkerAndOffset(expected: String, abbrevMarker: String, offset: Int, maxWidth: Int): Unit = {
27 | val abcdefghijklmno = "abcdefghijklmno"
28 | val message = "abbreviate(String,String,int,int) failed"
29 | val result = abcdefghijklmno.ops.abbreviate(abbrevMarker, offset, maxWidth)
30 | assert(result.isDefined)
31 | result foreach { actual =>
32 | if (offset >= 0 && offset < abcdefghijklmno.length) {
33 | assert(actual.indexOf(('a' + offset).toChar) != -1, message + " -- should contain offset character")
34 | }
35 | assert(actual.length <= maxWidth, message + " -- should not be greater than maxWidth")
36 | assert(expected == actual, message)
37 | }
38 | }
39 |
40 | private def assertAbbreviateWithOffset(expected: String, offset: Int, maxWidth: Int): Unit = {
41 | val abcdefghijklmno = "abcdefghijklmno"
42 | val message = "abbreviate(String,int,int) failed"
43 | val result = abcdefghijklmno.ops.abbreviate(offset, maxWidth)
44 | assert(result.isDefined)
45 | result foreach { actual =>
46 | if (offset >= 0 && offset < abcdefghijklmno.length) {
47 | assert(actual.indexOf(('a' + offset).toChar) != -1, message + " -- should contain offset character")
48 | }
49 | assert(actual.length <= maxWidth, message + " -- should not be greater than maxWidth")
50 | assert(expected == actual, message)
51 | }
52 | }
53 |
54 | private def innerTestSplit(separator: Char, sepStr: String, noMatch: Char): Unit = {
55 | val msg = "Failed on separator hex(" + Integer.toHexString(separator) + "), noMatch hex(" + Integer.toHexString(
56 | noMatch
57 | ) + "), sepStr(" + sepStr + ")"
58 | val str = "a" + separator + "b" + separator + separator + noMatch + "c"
59 |
60 | // (str, sepStr)
61 | val res1 = str.ops.split(sepStr).get
62 | assert(3 == res1.length, msg)
63 | assert("a" == res1(0))
64 | assert("b" == res1(1))
65 | assert((noMatch + "c") == res1(2))
66 | val str2 = separator + "a" + separator
67 | val res2 = str2.ops.split(sepStr).get
68 | assert(1 == res2.length, msg)
69 | assert("a" == res2(0), msg)
70 | val res3 = str.ops.split(sepStr, -1).get
71 | assert(3 == res3.length, msg)
72 | assert("a" == res3(0), msg)
73 | assert("b" == res3(1), msg)
74 | assert((noMatch + "c") == res3(2), msg)
75 | val res4 = str.ops.split(sepStr, 0).get
76 | assert(3 == res4.length, msg)
77 | assert("a" == res4(0), msg)
78 | assert("b" == res4(1), msg)
79 | assert((noMatch + "c") == res4(2), msg)
80 | val res5 = str.ops.split(sepStr, 1).get
81 | assert(1 == res5.length, msg)
82 | assert(str == res5(0), msg)
83 | val res6 = str.ops.split(sepStr, 2).get
84 | assert(2 == res6.length, msg)
85 | assert("a" == res6(0), msg)
86 | assert(str.substring(2) == res6(1), msg)
87 | }
88 |
89 | private def innerTestSplitPreserveAllTokens(separator: Char, sepStr: String, noMatch: Char): Unit = {
90 | val msg = "Failed on separator hex(" + Integer.toHexString(separator) + "), noMatch hex(" + Integer.toHexString(
91 | noMatch
92 | ) + "), sepStr(" + sepStr + ")"
93 | val str = "a" + separator + "b" + separator + separator + noMatch + "c"
94 | val res = str.ops.splitPreserveAllTokens(sepStr)
95 | assert(res.isDefined)
96 | val resStr = res.get
97 | assert(4 == resStr.length, msg)
98 | assert("a" == resStr(0), msg)
99 | assert("b" == resStr(1), msg)
100 | assert("" == resStr(2), msg)
101 | assert(noMatch + "c" == resStr(3), msg)
102 |
103 | val str2 = separator + "a" + separator
104 | val res2 = str2.ops.splitPreserveAllTokens(sepStr)
105 | assert(res2.isDefined)
106 | val resStr2 = res2.get
107 |
108 | assert(3 == resStr2.length, msg)
109 | assert("" == resStr2(0), msg)
110 | assert("a" == resStr2(1), msg)
111 | assert("" == resStr2(2), msg)
112 |
113 | val res3 = str.ops.splitPreserveAllTokens(sepStr, -1)
114 | assert(res3.isDefined)
115 | val resStr3 = res3.get
116 |
117 | assert(4 == resStr3.length, msg)
118 | assert("a" == resStr3(0), msg)
119 | assert("b" == resStr3(1), msg)
120 | assert("" == resStr3(2), msg)
121 | assert(noMatch + "c" == resStr3(3), msg)
122 |
123 | val res4 = str.ops.splitPreserveAllTokens(sepStr, 0)
124 | assert(res4.isDefined)
125 | val resStr4 = res4.get
126 |
127 | assert(4 == resStr4.length, msg)
128 | assert("a" == resStr4(0), msg)
129 | assert("b" == resStr4(1), msg)
130 | assert("" == resStr4(2), msg)
131 | assert(noMatch + "c" == resStr4(3), msg)
132 |
133 | val res5 = str.ops.splitPreserveAllTokens(sepStr, 1)
134 | assert(res5.isDefined)
135 | val resStr5 = res5.get
136 |
137 | assert(1 == resStr5.length, msg)
138 | assert(str == resStr5(0), msg)
139 |
140 | val res6 = str.ops.splitPreserveAllTokens(sepStr, 2)
141 | assert(res6.isDefined)
142 | val resStr6 = res6.get
143 |
144 | assert(2 == resStr6.length, msg)
145 | assert("a" == resStr6(0), msg)
146 | assert(str.substring(2) == resStr6(1), msg)
147 | }
148 |
149 | test("test abbreviate marker with empty string") {
150 | val greaterThanMaxTest = "much too long text"
151 | assert(greaterThanMaxTest.ops.abbreviate("", 13).contains("much too long"))
152 | }
153 |
154 | test("test abbreviate string int") {
155 | assert(noneString.ops.abbreviate(10).isEmpty)
156 | assert("".ops.abbreviate(10).contains(""))
157 | assert(Some("short").ops.abbreviate(10).contains("short"))
158 | assert("Now is the time for all good men to come to the aid of their party.".ops.abbreviate(10).contains("Now is ..."))
159 |
160 | val raspberry = "raspberry peach"
161 | assert(raspberry.ops.abbreviate(14).contains("raspberry p..."))
162 | assert(Some("raspberry peach").ops.abbreviate(15).contains("raspberry peach"))
163 | assert("raspberry peach".ops.abbreviate(16).contains("raspberry peach"))
164 | assert("abcdefg".ops.abbreviate(6).contains("abc..."))
165 | assert("abcdefg".ops.abbreviate(7).contains("abcdefg"))
166 | assert("abcdefg".ops.abbreviate(8).contains("abcdefg"))
167 | assert(Some("abcdefg").ops.abbreviate(4).contains("a..."))
168 | assert("".ops.abbreviate(4).contains(""))
169 |
170 | assertThrows[IllegalArgumentException] {
171 | "abc".ops.abbreviate(3)
172 | }
173 | }
174 |
175 | test("test string abbreviate with offset and max width") {
176 | assert(nullString.ops.abbreviate(10, 12).isEmpty)
177 | assert("".ops.abbreviate(0, 10).contains(""))
178 | assert(Some("").ops.abbreviate(2, 10).contains(""))
179 |
180 | assertThrows[IllegalArgumentException] {
181 | "abcdefghij".ops.abbreviate(0, 3)
182 | }
183 | assertThrows[IllegalArgumentException] {
184 | "abcdefghij".ops.abbreviate(5, 6)
185 | }
186 |
187 | val raspberry = "raspberry peach"
188 | assert(raspberry.ops.abbreviate(11, 15).contains("raspberry peach"))
189 |
190 | assert(nullString.ops.abbreviate(7, 14).isEmpty)
191 | assertAbbreviateWithOffset("abcdefg...", -1, 10)
192 | assertAbbreviateWithOffset("abcdefg...", 0, 10)
193 | assertAbbreviateWithOffset("abcdefg...", 1, 10)
194 | assertAbbreviateWithOffset("abcdefg...", 2, 10)
195 | assertAbbreviateWithOffset("abcdefg...", 3, 10)
196 | assertAbbreviateWithOffset("abcdefg...", 4, 10)
197 | assertAbbreviateWithOffset("...fghi...", 5, 10)
198 | assertAbbreviateWithOffset("...ghij...", 6, 10)
199 | assertAbbreviateWithOffset("...hijk...", 7, 10)
200 | assertAbbreviateWithOffset("...ijklmno", 8, 10)
201 | assertAbbreviateWithOffset("...ijklmno", 9, 10)
202 | assertAbbreviateWithOffset("...ijklmno", 10, 10)
203 | assertAbbreviateWithOffset("...ijklmno", 10, 10)
204 | assertAbbreviateWithOffset("...ijklmno", 11, 10)
205 | assertAbbreviateWithOffset("...ijklmno", 12, 10)
206 | assertAbbreviateWithOffset("...ijklmno", 13, 10)
207 | assertAbbreviateWithOffset("...ijklmno", 14, 10)
208 | assertAbbreviateWithOffset("...ijklmno", 15, 10)
209 | assertAbbreviateWithOffset("...ijklmno", 16, 10)
210 | assertAbbreviateWithOffset("...ijklmno", Integer.MAX_VALUE, 10)
211 | }
212 |
213 | test("test string abbreviate with abbrev maker and max width") {
214 | assert(nullString.ops.abbreviate(null, 10).isEmpty)
215 | assert(None.ops.abbreviate("...", 10).isEmpty)
216 | assert(Some("paranaguacu").ops.abbreviate(None, 10).contains("paranaguacu"))
217 | assert("".ops.abbreviate("...", 2).contains(""))
218 | assert("waiheke".ops.abbreviate("**", 5).contains("wai**"))
219 | assert("And after a long time, he finally met his son.".ops.abbreviate(",,,,", 10).contains("And af,,,,"))
220 |
221 | val raspberry = "raspberry peach"
222 | assert(raspberry.ops.abbreviate("..", 14).contains("raspberry pe.."))
223 | assert(Some("raspberry peach").ops.abbreviate("---*---", 15).contains("raspberry peach"))
224 | assert("raspberry peach".ops.abbreviate(".", 16).contains("raspberry peach"))
225 | assert("abcdefg".ops.abbreviate(Some("()("), 6).contains("abc()("))
226 | assert("abcdefg".ops.abbreviate(";", 7).contains("abcdefg"))
227 | assert(Some("abcdefg").ops.abbreviate("_-", 8).contains("abcdefg"))
228 | assert("abcdefg".ops.abbreviate(".", 4).contains("abc."))
229 | assert("".ops.abbreviate("", 4).contains(""))
230 |
231 | assertThrows[IllegalArgumentException] {
232 | Some("abcdefghij").ops.abbreviate(Some("..."), 3)
233 | }
234 |
235 | }
236 |
237 | test("test strings abbreviate with abbrev maker, offset and max width") {
238 | assert(nullString.ops.abbreviate(None, 10, 12).isEmpty)
239 | assert(noneString.ops.abbreviate("...", 10, 12).isEmpty)
240 | assert("".ops.abbreviate(null, 0, 10).contains(""))
241 | assert(Some("").ops.abbreviate("...", 2, 10).contains(""))
242 |
243 | assertThrows[IllegalArgumentException] {
244 | Some("abcdefghij").ops.abbreviate(Some("::"), 0, 2)
245 | }
246 | assertThrows[IllegalArgumentException] {
247 | Some("abcdefghij").ops.abbreviate("!!!", 5, 6)
248 | }
249 |
250 | val raspberry = "raspberry peach"
251 | assert(raspberry.ops.abbreviate("--", 12, 15).contains("raspberry peach"))
252 |
253 | assert(noneString.ops.abbreviate(";", 7, 14).isEmpty)
254 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdefgh;;", ";;", -1, 10)
255 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdefghi.", ".", 0, 10)
256 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdefgh++", "++", 1, 10)
257 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdefghi*", "*", 2, 10)
258 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdef{{{{", "{{{{", 4, 10)
259 | assertAbbreviateWithAbbrevMarkerAndOffset("abcdef____", "____", 5, 10)
260 | assertAbbreviateWithAbbrevMarkerAndOffset("==fghijk==", "==", 5, 10)
261 | assertAbbreviateWithAbbrevMarkerAndOffset("___ghij___", "___", 6, 10)
262 | assertAbbreviateWithAbbrevMarkerAndOffset("/ghijklmno", "/", 7, 10)
263 | assertAbbreviateWithAbbrevMarkerAndOffset("/ghijklmno", "/", 8, 10)
264 | assertAbbreviateWithAbbrevMarkerAndOffset("/ghijklmno", "/", 9, 10)
265 | assertAbbreviateWithAbbrevMarkerAndOffset("///ijklmno", "///", 10, 10)
266 | assertAbbreviateWithAbbrevMarkerAndOffset("//hijklmno", "//", 10, 10)
267 | assertAbbreviateWithAbbrevMarkerAndOffset("//hijklmno", "//", 11, 10)
268 | assertAbbreviateWithAbbrevMarkerAndOffset("...ijklmno", "...", 12, 10)
269 | assertAbbreviateWithAbbrevMarkerAndOffset("/ghijklmno", "/", 13, 10)
270 | assertAbbreviateWithAbbrevMarkerAndOffset("/ghijklmno", "/", 14, 10)
271 | assertAbbreviateWithAbbrevMarkerAndOffset("999ijklmno", "999", 15, 10)
272 | assertAbbreviateWithAbbrevMarkerAndOffset("_ghijklmno", "_", 16, 10)
273 | assertAbbreviateWithAbbrevMarkerAndOffset("+ghijklmno", "+", Integer.MAX_VALUE, 10)
274 | }
275 |
276 | test("test abbreviate middle") {
277 | // javadoc examples
278 | assert(noneString.ops.abbreviateMiddle(null, 0).isEmpty)
279 | assert("abc".ops.abbreviateMiddle(null, 0).contains("abc"))
280 | assert("abc".ops.abbreviateMiddle(Some("."), 0).contains("abc"))
281 | assert("abc".ops.abbreviateMiddle(Some("."), 3).contains("abc"))
282 | assert(Some("abcdef").ops.abbreviateMiddle(".", 4).contains("ab.f"))
283 |
284 | // JIRA issue (LANG-405) example (slightly different than actual expected result)
285 | assert(
286 | Some("A very long text with unimportant stuff in the middle but interesting start and " + "end to see if the text is complete.").ops
287 | .abbreviateMiddle("...", 50)
288 | .contains("A very long text with un...f the text is complete.")
289 | )
290 |
291 | // Test a much longer text :)
292 | val longText = "Start text" + "x".ops.repeat(10000) + "Close text"
293 | assert(longText.ops.abbreviateMiddle("->", 22).contains("Start text->Close text"))
294 |
295 | // Test negative length
296 | assert("abc".ops.abbreviateMiddle(".", -1).contains("abc"))
297 |
298 | // Test boundaries
299 | // Fails to change anything as method ensures first and last char are kept
300 | assert(Some("abc").ops.abbreviateMiddle(".", 1).contains("abc"))
301 | assert("abc".ops.abbreviateMiddle(Some("."), 2).contains("abc"))
302 |
303 | // Test length of n=1
304 | assert(Some("a").ops.abbreviateMiddle(".", 1).contains("a"))
305 |
306 | // Test smallest length that can lead to success
307 | assert("abcd".ops.abbreviateMiddle(".", 3).contains("a.d"))
308 |
309 | // More from LANG-405
310 | assert("abcdef".ops.abbreviateMiddle("..", 4).contains("a..f"))
311 | assert("abcdef".ops.abbreviateMiddle(".", 5).contains("ab.ef"))
312 | }
313 |
314 | test("test string append if missing") {
315 | assert(nullString.ops.appendIfMissing(noneString).isEmpty, "appendIfMissing(null,null)")
316 | assert(Some("abc").ops.appendIfMissing(nullString).contains("abc"), "appendIfMissing(abc,null)")
317 | assert("".ops.appendIfMissing(Some("xyz")).contains("xyz"), "appendIfMissing(\"\",xyz)")
318 | assert("abc".ops.appendIfMissing("xyz").contains("abcxyz"), "appendIfMissing(abc,xyz)")
319 | assert(Some("abcxyz").ops.appendIfMissing(Some("xyz")).contains("abcxyz"), "appendIfMissing(abcxyz,xyz)")
320 | assert("aXYZ".ops.appendIfMissing("xyz").contains("aXYZxyz"), "appendIfMissing(aXYZ,xyz)")
321 |
322 | assert(
323 | nullString.ops.appendIfMissing(nullString, null.asInstanceOf[Array[CharSequence]]: _*).isEmpty,
324 | "appendIfMissing(null,null,null)"
325 | )
326 | assert(
327 | "abc".ops.appendIfMissing(noneString, null.asInstanceOf[Array[CharSequence]]: _*).contains("abc"),
328 | "appendIfMissing(abc,null,null)"
329 | )
330 | assert("".ops.appendIfMissing("xyz", null.asInstanceOf[Array[CharSequence]]: _*).contains("xyz"), "appendIfMissing(\"\",xyz,null))")
331 | assert("abc".ops.appendIfMissing("xyz", nullString).contains("abcxyz"), "appendIfMissing(abc,xyz,{null})")
332 | assert("abc".ops.appendIfMissing("xyz", "").contains("abc"), "appendIfMissing(abc,xyz,\"\")")
333 | assert(Some("abc").ops.appendIfMissing("xyz", "mno").contains("abcxyz"), "appendIfMissing(abc,xyz,mno)")
334 | assert("abcxyz".ops.appendIfMissing("xyz", Some("mno")).contains("abcxyz"), "appendIfMissing(abcxyz,xyz,mno)")
335 | assert("abcmno".ops.appendIfMissing("xyz", "mno").contains("abcmno"), "appendIfMissing(abcmno,xyz,mno)")
336 | assert("abcXYZ".ops.appendIfMissing(Some("xyz"), Some("mno")).contains("abcXYZxyz"), "appendIfMissing(abcXYZ,xyz,mno)")
337 | assert("abcMNO".ops.appendIfMissing("xyz", "mno").contains("abcMNOxyz"), "appendIfMissing(abcMNO,xyz,mno)")
338 |
339 | }
340 |
341 | test("test append if missing ignore case") {
342 | assert(noneString.ops.appendIfMissingIgnoreCase(nullString).isEmpty, "appendIfMissingIgnoreCase(null,null)")
343 | assert("abc".ops.appendIfMissingIgnoreCase(noneString).contains("abc"), "appendIfMissingIgnoreCase(abc,null)")
344 | assert("".ops.appendIfMissingIgnoreCase("xyz").contains("xyz"), "appendIfMissingIgnoreCase(\"\",xyz)")
345 | assert(Some("abc").ops.appendIfMissingIgnoreCase("xyz").contains("abcxyz"), "appendIfMissingIgnoreCase(abc,xyz)")
346 | assert("abcxyz".ops.appendIfMissing("xyz").contains("abcxyz"), "appendIfMissingIgnoreCase(abcxyz,xyz)")
347 | assert("abcXYZ".ops.appendIfMissingIgnoreCase("xyz").contains("abcXYZ"), "appendIfMissingIgnoreCase(abcXYZ,xyz)")
348 |
349 | assert(nullString.ops.appendIfMissingIgnoreCase(noneString, null).isEmpty, "appendIfMissingIgnoreCase(null,null,null)")
350 | assert("abc".ops.appendIfMissingIgnoreCase(null, null).contains("abc"), "appendIfMissingIgnoreCase(abc,null,null)")
351 | assert("".ops.appendIfMissingIgnoreCase("xyz", null).contains("xyz"), "appendIfMissingIgnoreCase(\"\",xyz,null)")
352 | assert("abc".ops.appendIfMissingIgnoreCase("xyz", null).contains("abcxyz"), "appendIfMissingIgnoreCase(abc,xyz,{null})")
353 | assert(Some("abc").ops.appendIfMissingIgnoreCase(Some("xyz"), "").contains("abc"), "appendIfMissingIgnoreCase(abc,xyz,\"\")")
354 | assert("abc".ops.appendIfMissingIgnoreCase("xyz", "mno").contains("abcxyz"), "appendIfMissingIgnoreCase(abc,xyz,mno)")
355 | assert(Some("abcxyz").ops.appendIfMissingIgnoreCase("xyz", Some("mno")).contains("abcxyz"), "appendIfMissingIgnoreCase(abcxyz,xyz,mno)")
356 | assert("abcmno".ops.appendIfMissingIgnoreCase("xyz", "mno").contains("abcmno"), "appendIfMissingIgnoreCase(abcmno,xyz,mno)")
357 | assert(
358 | Some("abcXYZ").ops.appendIfMissingIgnoreCase(Some("xyz"), Some("mno")).contains("abcXYZ"),
359 | "appendIfMissingIgnoreCase(abcXYZ,xyz,mno)"
360 | )
361 | assert("abcMNO".ops.appendIfMissingIgnoreCase("abcMNO", "xyz", "mno").contains("abcMNO"), "appendIfMissingIgnoreCase(abcMNO,xyz,mno)")
362 | }
363 |
364 | test("test string capitalize") {
365 | assert(nullString.ops.capitalize.isEmpty)
366 |
367 | assert(Some("").ops.capitalize.contains(""), "capitalize(empty-string) failed")
368 | assert("x".ops.capitalize.contains("X"), "capitalize(single-char-string) failed")
369 | assert(FOO_CAP.ops.capitalize.contains(FOO_CAP), "capitalize(String) failed")
370 | assert(FOO_UNCAP.ops.capitalize.contains(FOO_CAP), "capitalize(string) failed")
371 |
372 | assert(Some("\u01C9").ops.capitalize.contains("\u01C8"), "capitalize(String) is not using TitleCase")
373 |
374 | // Javadoc examples
375 | assert(noneString.ops.capitalize.isEmpty)
376 | assert("".ops.capitalize.contains(""))
377 | assert("cat".ops.capitalize.contains("Cat"))
378 | assert("cAt".ops.capitalize.contains("CAt"))
379 | assert(Some("'cat'").ops.capitalize.contains("'cat'"))
380 | }
381 |
382 | test("test string utils center with size") {
383 | assert(nullString.ops.center(-1).isEmpty)
384 | assert(noneString.ops.center(4).isEmpty)
385 | assert(Some("").ops.center(4).contains(" "))
386 | assert("ab".ops.center(0).contains("ab"))
387 | assert("ab".ops.center(-1).contains("ab"))
388 | assert("ab".ops.center(1).contains("ab"))
389 | assert("".ops.center(4).contains(" "))
390 | assert("ab".ops.center(4).contains(" ab "))
391 | assert("abcd".ops.center(2).contains("abcd"))
392 | assert("a".ops.center(4).contains(" a "))
393 | assert(Some("a").ops.center(5).contains(" a "))
394 | }
395 |
396 | test("test string utils center with size and pad char") {
397 | assert(nullString.ops.center(-1, ' ').isEmpty)
398 | assert(noneString.ops.center(4, ' ').isEmpty)
399 | assert(Some("").ops.center(4, ' ').contains(" "))
400 | assert("ab".ops.center(0, ' ').contains("ab"))
401 | assert(Some("ab").ops.center(-1, ' ').contains("ab"))
402 | assert("ab".ops.center(1, ' ').contains("ab"))
403 | assert("".ops.center(4, ' ').contains(" "))
404 | assert("ab".ops.center(4, ' ').contains(" ab "))
405 | assert("abcd".ops.center(2, ' ').contains("abcd"))
406 | assert("a".ops.center(4, ' ').contains(" a "))
407 | assert("a".ops.center(5, ' ').contains(" a "))
408 | assert("a".ops.center(5, 'x').contains("xxaxx"))
409 | }
410 |
411 | test("test string utils chomp") {
412 | val chompCases = Array(
413 | Array(FOO_UNCAP + "\r\n", FOO_UNCAP),
414 | Array(FOO_UNCAP + "\n", FOO_UNCAP),
415 | Array(FOO_UNCAP + "\r", FOO_UNCAP),
416 | Array(FOO_UNCAP + " \r", FOO_UNCAP + " "),
417 | Array(FOO_UNCAP, FOO_UNCAP),
418 | Array(FOO_UNCAP + "\n\n", FOO_UNCAP + "\n"),
419 | Array(FOO_UNCAP + "\r\n\r\n", FOO_UNCAP + "\r\n"),
420 | Array("foo\nfoo", "foo\nfoo"),
421 | Array("foo\n\rfoo", "foo\n\rfoo"),
422 | Array("\n", ""),
423 | Array("\r", ""),
424 | Array("a", "a"),
425 | Array("\r\n", ""),
426 | Array("", ""),
427 | Array(nullString, nullString),
428 | Array(FOO_UNCAP + "\n\r", FOO_UNCAP + "\n")
429 | )
430 | for (chompCase <- chompCases) {
431 | val original = chompCase(0)
432 | val expectedResult = chompCase(1)
433 | original.ops.chomp match {
434 | case None => assert(expectedResult == null)
435 | case Some(value) => assert(value == expectedResult)
436 | }
437 | }
438 | // StringUtils.chomp(String, String) is deprecated
439 | }
440 |
441 | test("test default string") {
442 | assert(noneString.ops.defaultString == "")
443 | assert(Some("").ops.defaultString == "")
444 | assert("abc".ops.defaultString == "abc")
445 | }
446 |
447 | test("test string utils default with default value") {
448 | assert(nullString.ops.defaultString("NULL").contains("NULL"))
449 | assert("".ops.defaultString("NULL").contains(""))
450 | assert("abc".ops.defaultString("NULL").contains("abc"))
451 | }
452 |
453 | test("test string utils default if blank with char buffers") {
454 | assert(CharBuffer.wrap("").toString.ops.defaultIfBlank(CharBuffer.wrap("NULL")).toString == "NULL")
455 | assert(CharBuffer.wrap(" ").toString.ops.defaultIfBlank(CharBuffer.wrap("NULL")).toString == "NULL")
456 | assert(CharBuffer.wrap("abc").toString.ops.defaultIfBlank(CharBuffer.wrap("NULL")).toString == "abc")
457 |
458 | assert(CharBuffer.wrap("").toString.ops.defaultIfBlank(null.asInstanceOf[CharBuffer]) == null)
459 | // Tests compatibility for the API return type
460 | val s = CharBuffer.wrap("abc").toString.ops.defaultIfBlank(CharBuffer.wrap("NULL")).toString
461 | assert(s == "abc")
462 | }
463 |
464 | test("test string utils default string if blank string builder") {
465 | assert((new mutable.StringBuilder("")).toString().ops.defaultIfBlank(new mutable.StringBuilder("NULL")).toString == "NULL")
466 | assert(Some(new mutable.StringBuilder(" ").toString()).ops.defaultIfBlank(new mutable.StringBuilder("NULL")).toString == "NULL")
467 | assert((new mutable.StringBuilder("abc")).toString().ops.defaultIfBlank(new mutable.StringBuilder("NULL")).toString == "abc")
468 |
469 | assert((new mutable.StringBuilder("")).toString().ops.defaultIfBlank(null.asInstanceOf[mutable.StringBuilder]) == null)
470 | // Tests compatibility for the API return type
471 | val s = Some(new mutable.StringBuilder("abc").toString()).ops.defaultIfBlank(new mutable.StringBuilder("NULL")).toString
472 | assert("abc" == s)
473 | }
474 |
475 | test("test string utils default string if blank with string") {
476 | assert(nullString.ops.defaultIfBlank("NULL") == "NULL")
477 | assert("".ops.defaultIfBlank("NULL") == "NULL")
478 | assert(Some(" ").ops.defaultIfBlank("NULL") == "NULL")
479 | assert("abc".ops.defaultIfBlank("NULL") == "abc")
480 | assert("".ops.defaultIfBlank(null.asInstanceOf[String]) == null)
481 | // Tests compatibility for the API return type
482 | val s = "abc".ops.defaultIfBlank("NULL")
483 | assert(s == "abc")
484 | }
485 |
486 | test("test string get if blank with string supplier") {
487 | assert(nullString.ops.getIfBlank(() => "NULL") == "NULL")
488 | assert(Some("").ops.getIfBlank(() => "NULL") == "NULL")
489 | assert(" ".ops.getIfBlank(() => "NULL") == "NULL")
490 | assert("abc".ops.getIfBlank(() => "NULL") == "abc")
491 | assert("".ops.getIfBlank(() => None) == null)
492 | assert("".ops.getIfBlank(() => null.asInstanceOf[String]) == null)
493 | // Tests compatibility for the API return type
494 | val s = "abc".ops.getIfBlank(() => "NULL")
495 | assert(s.toString == "abc")
496 | // Checking that default value supplied only on demand
497 | val numberOfCalls = new MutableInt(0)
498 | val countingDefaultSupplier: Supplier[String] = () => {
499 | def foo(): String = {
500 | numberOfCalls.increment()
501 | "NULL"
502 | }
503 |
504 | foo()
505 | }
506 | "abc".ops.getIfBlank(countingDefaultSupplier)
507 | assert(0 == numberOfCalls.getValue)
508 | "".ops.getIfBlank(countingDefaultSupplier)
509 | assert(1 == numberOfCalls.getValue)
510 | " ".ops.getIfBlank(countingDefaultSupplier)
511 | assert(2 == numberOfCalls.getValue)
512 | noneString.ops.getIfBlank(countingDefaultSupplier)
513 | assert(3 == numberOfCalls.getValue)
514 | }
515 |
516 | test("test string default if empty with char buffers") {
517 | assert(Some(CharBuffer.wrap("").toString).ops.defaultIfEmpty(CharBuffer.wrap("NULL")).toString == "NULL")
518 | assert(nullString.ops.defaultIfEmpty("NULL").toString == "NULL")
519 | assert(CharBuffer.wrap("abc").toString.ops.defaultIfEmpty(CharBuffer.wrap("NULL")).toString == "abc")
520 | assert(CharBuffer.wrap("").toString.ops.defaultIfEmpty(null.asInstanceOf[CharBuffer]) == null)
521 | // Tests compatibility for the API return type
522 | val s = CharBuffer.wrap("abc").toString.ops.defaultIfEmpty(CharBuffer.wrap("NULL"))
523 | assert(s == "abc")
524 | }
525 |
526 | test("test string default if empty with string builder") {
527 | assert(
528 | Some(new mutable.StringBuilder("").toString()).ops.defaultIfEmpty(new mutable.StringBuilder("NULL")).toString == "NULL"
529 | )
530 | assert((new mutable.StringBuilder("abc").toString()).ops.defaultIfEmpty(new mutable.StringBuilder("NULL")).toString == "abc")
531 | assert((new mutable.StringBuilder("")).toString().ops.defaultIfEmpty(noneString) == null)
532 | // Tests compatibility for the API return type
533 | val s = (new mutable.StringBuilder("abc")).toString().ops.defaultIfEmpty(new mutable.StringBuilder("NULL"))
534 | assert(s.toString == "abc")
535 | }
536 |
537 | test("test string default if empty with string") {
538 | assert(nullString.ops.defaultIfEmpty("NULL") == "NULL")
539 | assert(Some("").ops.defaultIfEmpty("NULL") == "NULL")
540 | assert("abc".ops.defaultIfEmpty("NULL") == "abc")
541 | assert("".ops.defaultIfEmpty(null) == null)
542 | // Tests compatibility for the API return type
543 | val s = "abc".ops.defaultIfEmpty("NULL")
544 | assert(s == "abc")
545 | }
546 |
547 | test("get string get if emtpy with supplier") {
548 | assert(nullString.ops.getIfEmpty(() => "NULL") == "NULL")
549 | assert(Some("").ops.getIfEmpty(() => "NULL") == "NULL")
550 | assert("abc".ops.getIfEmpty(() => "NULL") == "abc")
551 | assert(Some("").ops.getIfEmpty(() => null) == null)
552 | assert("".ops.getIfEmpty(null.asInstanceOf[Supplier[String]]) == null)
553 | // Tests compatibility for the API return type
554 | val s = "abc".ops.getIfEmpty(() => "NULL")
555 | assert(s.toString == "abc")
556 | // Checking that default value supplied only on demand
557 | val numberOfCalls = new MutableInt(0)
558 | val countingDefaultSupplier: Supplier[String] = () => {
559 | def foo(): String = {
560 | numberOfCalls.increment()
561 | "NULL"
562 | }
563 |
564 | foo()
565 | }
566 | Some("abc").ops.getIfEmpty(countingDefaultSupplier)
567 | assert(0 == numberOfCalls.getValue)
568 | "".ops.getIfEmpty(countingDefaultSupplier)
569 | assert(1 == numberOfCalls.getValue)
570 | noneString.ops.getIfEmpty(countingDefaultSupplier)
571 | assert(2 == numberOfCalls.getValue)
572 | }
573 |
574 | test("test string delete white space") {
575 | assert(nullString.ops.deleteWhitespace().isEmpty)
576 | assert("".ops.deleteWhitespace().contains(""))
577 | assert(Some(" \u000C \t\t\u001F\n\n \u000B ").ops.deleteWhitespace().contains(""))
578 | assert(WHITESPACE.ops.deleteWhitespace().contains(""))
579 | assert(NON_WHITESPACE.ops.deleteWhitespace().contains(NON_WHITESPACE))
580 | // Note: u-2007 and u-000A both cause problems in the source code
581 | // it should ignore 2007 but delete 000A
582 | assert(Some(" \u00A0 \t\t\n\n \u202F ").ops.deleteWhitespace().contains("\u00A0\u202F"))
583 | assert("\u00A0\u202F".ops.deleteWhitespace().contains("\u00A0\u202F"))
584 | assert("\u000Bt \t\n\u0009e\rs\n\n \tt".ops.deleteWhitespace().contains("test"))
585 | }
586 |
587 | test("test string difference to string") {
588 | assert(noneString.ops.difference(nullString).ops.isEmpty)
589 | assert(Some("").ops.difference(Some("")).contains(""))
590 | assert("".ops.difference("abc").contains("abc"))
591 | assert("abc".ops.difference("").contains(""))
592 | assert(nullString.ops.difference("i am a robot").contains("i am a robot"))
593 | assert("i am a machine".ops.difference(noneString).contains("i am a machine"))
594 | assert("i am a machine".ops.difference("i am a robot").contains("robot"))
595 | assert("abc".ops.difference("abc").contains(""))
596 | assert("i am a robot".ops.difference("you are a robot").contains("you are a robot"))
597 | }
598 |
599 | test("test string index of difference between string") {
600 | assert(-1 == nullString.ops.indexOfDifference(noneString))
601 | assert(0 == nullString.ops.indexOfDifference("i am a robot"))
602 | assert(-1 == Some("").ops.indexOfDifference(""))
603 | assert(0 == Some("").ops.indexOfDifference("abc"))
604 | assert(0 == "abc".ops.indexOfDifference(""))
605 | assert(0 == "i am a machine".ops.indexOfDifference(nullString))
606 | assert(7 == "i am a machine".ops.indexOfDifference("i am a robot"))
607 | assert(-1 == "foo".ops.indexOfDifference("foo"))
608 | assert(0 == "i am a robot".ops.indexOfDifference("you are a robot"))
609 | }
610 |
611 | test("test string get bytes") {
612 | assert(ArrayUtils.EMPTY_BYTE_ARRAY sameElements nullString.ops.getBytes(nullString))
613 | assert(Strings.EMPTY.getBytes sameElements Strings.EMPTY.ops.getBytes(nullString))
614 | assert(
615 | Strings.EMPTY.getBytes(StandardCharsets.US_ASCII.name) sameElements
616 | Strings.EMPTY.ops.getBytes(StandardCharsets.US_ASCII.name)
617 | )
618 | }
619 |
620 | test("test string get digits") {
621 | assert(nullString.ops.getDigits == null)
622 | assert(Some("").ops.getDigits == "")
623 | assert("abc".ops.getDigits == "")
624 | assert("1000$".ops.getDigits == "1000")
625 | assert("123password45".ops.getDigits == "12345")
626 | assert(Some("(541) 754-3010").ops.getDigits == "5417543010")
627 | assert("\u0967\u0968\u0969".ops.getDigits == "\u0967\u0968\u0969")
628 | }
629 |
630 | test("test string is all lower case") {
631 |
632 | assert(!nullString.ops.isAllLowerCase)
633 | assert(!Strings.EMPTY.ops.isAllLowerCase)
634 | assert(!" ".ops.isAllLowerCase)
635 | assert(Some("abc").ops.isAllLowerCase)
636 | assert(!"abc ".ops.isAllLowerCase)
637 | assert(!"abc\n".ops.isAllLowerCase)
638 | assert(!"abC".ops.isAllLowerCase)
639 | assert(!"ab c".ops.isAllLowerCase)
640 | assert(!"ab1c".ops.isAllLowerCase)
641 | assert(!"ab/c".ops.isAllLowerCase)
642 | }
643 |
644 | test("test string is all upper case") {
645 | assert(!noneString.ops.isAllUpperCase)
646 | assert(!Strings.EMPTY.ops.isAllUpperCase)
647 | assert(!Some(" ").ops.isAllUpperCase)
648 | assert(Some("ABC").ops.isAllUpperCase)
649 | assert(!"ABC ".ops.isAllUpperCase)
650 | assert(!"ABC\n".ops.isAllUpperCase)
651 | assert(!"aBC".ops.isAllUpperCase)
652 | assert(!"A C".ops.isAllUpperCase)
653 | assert(!"A1C".ops.isAllUpperCase)
654 | assert(!"A/C".ops.isAllUpperCase)
655 | }
656 |
657 | test("test string is mixed case") {
658 | assert(!nullString.ops.isMixedCase)
659 | assert(!Strings.EMPTY.ops.isMixedCase)
660 | assert(!" ".ops.isMixedCase)
661 | assert(!Some("A").ops.isMixedCase)
662 | assert(!"a".ops.isMixedCase)
663 | assert(!"/".ops.isMixedCase)
664 | assert(!"A/".ops.isMixedCase)
665 | assert(!"/b".ops.isMixedCase)
666 | assert(!"abc".ops.isMixedCase)
667 | assert(!"ABC".ops.isMixedCase)
668 | assert("aBc".ops.isMixedCase)
669 | assert("aBc ".ops.isMixedCase)
670 | assert("A c".ops.isMixedCase)
671 | assert("aBc\n".ops.isMixedCase)
672 | assert("A1c".ops.isMixedCase)
673 | assert("a/C".ops.isMixedCase)
674 | }
675 |
676 | test("test lang 623") {
677 | assert("\u00DE".ops.replaceChars('\u00DE', 't').contains("t"))
678 | assert(Some("\u00FE").ops.replaceChars('\u00FE', 't').contains("t"))
679 | }
680 |
681 | test("test lang 666") {
682 | assert("120.00".ops.stripEnd(".0").contains("12"))
683 | assert("121.00".ops.stripEnd(Some(".0")).contains("121"))
684 | }
685 |
686 | test("test string left pad with size and pad char") {
687 | assert(noneString.ops.leftPad(5, ' ').isEmpty)
688 | assert("".ops.leftPad(5, ' ').contains(" "))
689 | assert("abc".ops.leftPad(5, ' ').contains(" abc"))
690 | assert("abc".ops.leftPad(5, 'x').contains("xxabc"))
691 | assert("abc".ops.leftPad(5, '\uffff').contains("\uffff\uffffabc"))
692 | assert("abc".ops.leftPad(2, ' ').contains("abc"))
693 | val str = "aaa".ops.leftPad(10000, 'a').get // bigger than pad length
694 | assert(10000 == str.length)
695 | assert(str.ops.containsOnly('a'))
696 | }
697 |
698 | test("test string left pad with size and pad string") {
699 | assert(nullString.ops.leftPad(5, "-+").isEmpty)
700 | assert(noneString.ops.leftPad(5, nullString).isEmpty)
701 | assert("".ops.leftPad(5, " ").contains(" "))
702 | assert(Some("abc").ops.leftPad(7, "-+").contains("-+-+abc"))
703 | assert("abc".ops.leftPad(6, "-+~").contains("-+~abc"))
704 | assert("abc".ops.leftPad(5, "-+~").contains("-+abc"))
705 | assert("abc".ops.leftPad(2, " ").contains("abc"))
706 | assert("abc".ops.leftPad(-1, Some(" ")).contains("abc"))
707 | assert(Some("abc").ops.leftPad(5, noneString).contains(" abc"))
708 | assert("abc".ops.leftPad(5, Some("")).contains(" abc"))
709 | }
710 |
711 | test("test string lower case") {
712 | assert(nullString.ops.lowerCase.isEmpty)
713 | assert(noneString.ops.lowerCase(Locale.ENGLISH).isEmpty)
714 | assert("fOo test THING".ops.lowerCase.contains("foo test thing"), "lowerCase(String) failed")
715 | assert("".ops.lowerCase.contains(""), "lowerCase(empty-string) failed")
716 | assert("fOo test THING".ops.lowerCase(Locale.ENGLISH).contains("foo test thing"), "lowerCase(String, Locale) failed")
717 | assert("".ops.lowerCase(Locale.ENGLISH).contains(""), "lowerCase(empty-string, Locale) failed")
718 | }
719 |
720 | test("test string normalize space") {
721 | // Java says a non-breaking whitespace is not a whitespace.
722 | assert(!Character.isWhitespace('\u00A0'))
723 | //
724 | assert(nullString.ops.normalizeSpace.isEmpty)
725 | assert(Some("").ops.normalizeSpace.contains(""))
726 | assert(" ".ops.normalizeSpace.contains(""))
727 | assert("\t".ops.normalizeSpace.contains(""))
728 | assert("\n".ops.normalizeSpace.contains(""))
729 | assert("\u0009".ops.normalizeSpace.contains(""))
730 | assert("\u000B".ops.normalizeSpace.contains(""))
731 | assert("\u000C".ops.normalizeSpace.contains(""))
732 | assert("\u001C".ops.normalizeSpace.contains(""))
733 | assert("\u001D".ops.normalizeSpace.contains(""))
734 | assert("\u001E".ops.normalizeSpace.contains(""))
735 | assert("\u001F".ops.normalizeSpace.contains(""))
736 | assert("\f".ops.normalizeSpace.contains(""))
737 | assert("\r".ops.normalizeSpace.contains(""))
738 | assert(" a ".ops.normalizeSpace.contains("a"))
739 | assert(" a b c ".ops.normalizeSpace.contains("a b c"))
740 | assert("a\t\f\r b\u000B c\n".ops.normalizeSpace.contains("a b c"))
741 | assert(("a\t\f\r " + HARD_SPACE + HARD_SPACE + "b\u000B c\n").ops.normalizeSpace.contains("a b c"))
742 | assert("\u0000b".ops.normalizeSpace.contains("b"))
743 | assert("b\u0000".ops.normalizeSpace.contains("b"))
744 | }
745 |
746 | test("test string overlay with start end") {
747 | assert(nullString.ops.overlay(noneString, 2, 4).isEmpty)
748 | assert(noneString.ops.overlay(nullString, -2, -4).isEmpty)
749 |
750 | assert("".ops.overlay(noneString, 0, 0).contains(""))
751 | assert("".ops.overlay("", 0, 0).contains(""))
752 | assert("".ops.overlay("zzzz", 0, 0).contains("zzzz"))
753 | assert("".ops.overlay("zzzz", 2, 4).contains("zzzz"))
754 | assert("".ops.overlay("zzzz", -2, -4).contains("zzzz"))
755 |
756 | assert("abcdef".ops.overlay(nullString, 2, 4).contains("abef"))
757 | assert("abcdef".ops.overlay(noneString, 4, 2).contains("abef"))
758 | assert(Some("abcdef").ops.overlay("", 2, 4).contains("abef"))
759 | assert("abcdef".ops.overlay(Some(""), 4, 2).contains("abef"))
760 | assert("abcdef".ops.overlay("zzzz", 2, 4).contains("abzzzzef"))
761 | assert("abcdef".ops.overlay("zzzz", 4, 2).contains("abzzzzef"))
762 |
763 | assert("abcdef".ops.overlay("zzzz", -1, 4).contains("zzzzef"))
764 | assert("abcdef".ops.overlay("zzzz", 4, -1).contains("zzzzef"))
765 | assert("abcdef".ops.overlay("zzzz", -2, -1).contains("zzzzabcdef"))
766 | assert("abcdef".ops.overlay("zzzz", -1, -2).contains("zzzzabcdef"))
767 | assert("abcdef".ops.overlay("zzzz", 4, 10).contains("abcdzzzz"))
768 | assert("abcdef".ops.overlay("zzzz", 10, 4).contains("abcdzzzz"))
769 | assert("abcdef".ops.overlay("zzzz", 8, 10).contains("abcdefzzzz"))
770 | assert("abcdef".ops.overlay("zzzz", 10, 8).contains("abcdefzzzz"))
771 | }
772 |
773 | test("test string prepend if missing") {
774 | assert(nullString.ops.prependIfMissing(noneString).isEmpty, "prependIfMissing(null,null)")
775 | assert("abc".ops.prependIfMissing(nullString).contains("abc"), "prependIfMissing(abc,null)")
776 | assert(Some("").ops.prependIfMissing("xyz").contains("xyz"), "prependIfMissing(\"\",xyz)")
777 | assert("abc".ops.prependIfMissing(Some("xyz")).contains("xyzabc"), "prependIfMissing(abc,xyz)")
778 | assert("xyzabc".ops.prependIfMissing("xyz").contains("xyzabc"), "prependIfMissing(xyzabc,xyz)")
779 | assert("XYZabc".ops.prependIfMissing("xyz").contains("xyzXYZabc"), "prependIfMissing(XYZabc,xyz)")
780 |
781 | assert(
782 | nullString.ops.prependIfMissing(noneString, null.asInstanceOf[Array[CharSequence]]: _*).isEmpty,
783 | "prependIfMissing(null,null null)"
784 | )
785 | assert(
786 | "abc".ops.prependIfMissing(nullString, null.asInstanceOf[Array[CharSequence]]: _*).contains("abc"),
787 | "prependIfMissing(abc,null,null)"
788 | )
789 | assert("".ops.prependIfMissing("xyz", null.asInstanceOf[Array[CharSequence]]: _*).contains("xyz"), "prependIfMissing(\"\",xyz,null)")
790 | assert("abc".ops.prependIfMissing("xyz", nullString).contains("xyzabc"), "prependIfMissing(abc,xyz,{null})")
791 | assert("abc".ops.prependIfMissing("xyz", "").contains("abc"), "prependIfMissing(abc,xyz,\"\")")
792 | assert("abc".ops.prependIfMissing("xyz", "mno").contains("xyzabc"), "prependIfMissing(abc,xyz,mno)")
793 | assert("xyzabc".ops.prependIfMissing("xyz", "mno").contains("xyzabc"), "prependIfMissing(xyzabc,xyz,mno)")
794 | assert("mnoabc".ops.prependIfMissing("xyz", "mno").contains("mnoabc"), "prependIfMissing(mnoabc,xyz,mno)")
795 | assert("XYZabc".ops.prependIfMissing("xyz", "mno").contains("xyzXYZabc"), "prependIfMissing(XYZabc,xyz,mno)")
796 | assert("MNOabc".ops.prependIfMissing("xyz", "mno").contains("xyzMNOabc"), "prependIfMissing(MNOabc,xyz,mno)")
797 | }
798 |
799 | test("test string prepend if missing ignore case") {
800 | assert(nullString.ops.prependIfMissingIgnoreCase(noneString).isEmpty, "prependIfMissingIgnoreCase(null,null)")
801 | assert("abc".ops.prependIfMissingIgnoreCase(nullString).contains("abc"), "prependIfMissingIgnoreCase(abc,null)")
802 | assert("".ops.prependIfMissingIgnoreCase("xyz").contains("xyz"), "prependIfMissingIgnoreCase(\"\",xyz)")
803 | assert("abc".ops.prependIfMissingIgnoreCase("xyz").contains("xyzabc"), "prependIfMissingIgnoreCase(abc,xyz)")
804 | assert("xyzabc".ops.prependIfMissingIgnoreCase("xyz").contains("xyzabc"), "prependIfMissingIgnoreCase(xyzabc,xyz)")
805 | assert("XYZabc".ops.prependIfMissingIgnoreCase("xyz").contains("XYZabc"), "prependIfMissingIgnoreCase(XYZabc,xyz)")
806 |
807 | assert(
808 | noneString.ops.prependIfMissingIgnoreCase(nullString, null.asInstanceOf[Array[CharSequence]]: _*).isEmpty,
809 | "prependIfMissingIgnoreCase(null,null null)"
810 | )
811 | assert(
812 | "abc".ops.prependIfMissingIgnoreCase(noneString, null.asInstanceOf[Array[CharSequence]]: _*).contains("abc"),
813 | "prependIfMissingIgnoreCase(abc,null,null)"
814 | )
815 | assert(
816 | "".ops.prependIfMissingIgnoreCase("xyz", null.asInstanceOf[Array[CharSequence]]: _*).contains("xyz"),
817 | "prependIfMissingIgnoreCase(\"\",xyz,null)"
818 | )
819 | assert("abc".ops.prependIfMissingIgnoreCase("xyz", noneString).contains("xyzabc"), "prependIfMissingIgnoreCase(abc,xyz,{null})")
820 | assert("abc".ops.prependIfMissingIgnoreCase("xyz", "").contains("abc"), "prependIfMissingIgnoreCase(abc,xyz,\"\")")
821 | assert("abc".ops.prependIfMissingIgnoreCase("xyz", "mno").contains("xyzabc"), "prependIfMissingIgnoreCase(abc,xyz,mno)")
822 | assert(Some("xyzabc").ops.prependIfMissingIgnoreCase("xyz", "mno").contains("xyzabc"), "prependIfMissingIgnoreCase(xyzabc,xyz,mno)")
823 | assert("mnoabc".ops.prependIfMissingIgnoreCase("xyz", "mno").contains("mnoabc"), "prependIfMissingIgnoreCase(mnoabc,xyz,mno)")
824 | assert("XYZabc".ops.prependIfMissingIgnoreCase("xyz", "mno").contains("XYZabc"), "prependIfMissingIgnoreCase(XYZabc,xyz,mno)")
825 | assert("MNOabc".ops.prependIfMissingIgnoreCase("xyz", "mno").contains("MNOabc"), "prependIfMissingIgnoreCase(MNOabc,xyz,mno)")
826 | }
827 |
828 | test("test string recapitalize") {
829 | // reflection type of tests: Sentences.
830 | assert(SENTENCE_UNCAP.ops.capitalize.ops.uncapitalize.contains(SENTENCE_UNCAP), "uncapitalize(capitalize(String)) failed")
831 | assert(SENTENCE_CAP.ops.uncapitalize.ops.capitalize.contains(SENTENCE_CAP), "capitalize(uncapitalize(String)) failed")
832 |
833 | // reflection type of tests: One word.
834 | assert(FOO_UNCAP.ops.capitalize.ops.uncapitalize.contains(FOO_UNCAP), "uncapitalize(capitalize(String)) failed")
835 | assert(FOO_CAP.ops.uncapitalize.ops.capitalize.contains(FOO_CAP), "capitalize(uncapitalize(String)) failed")
836 | }
837 |
838 | test("test string remove string") {
839 | // StringUtils.remove(null, *) = null
840 | assert(nullString.ops.remove(nullString).isEmpty)
841 | assert(noneString.ops.remove("").isEmpty)
842 | assert(noneString.ops.remove("a").isEmpty)
843 |
844 | // StringUtils.remove("", *) = ""
845 | assert("".ops.remove(nullString).contains(""))
846 | assert("".ops.remove("").contains(""))
847 | assert(Some("").ops.remove("a").contains(""))
848 |
849 | // StringUtils.remove(*, null) = *
850 | assert(nullString.ops.remove(noneString).isEmpty)
851 | assert("".ops.remove(nullString).contains(""))
852 | assert("a".ops.remove(nullString).contains("a"))
853 |
854 | // StringUtils.remove(*, "") = *
855 | assert(noneString.ops.remove("").isEmpty)
856 | assert("".ops.remove("").contains(""))
857 | assert("a".ops.remove("").contains("a"))
858 |
859 | // StringUtils.remove("queued", "ue") = "qd"
860 | assert("queued".ops.remove("ue").contains("qd"))
861 |
862 | // StringUtils.remove("queued", "zz") = "queued"
863 | assert("queued".ops.remove("zz").contains("queued"))
864 | }
865 |
866 | test("test string remove end") {
867 | assert(noneString.ops.removeEnd(nullString).isEmpty)
868 | assert(nullString.ops.removeEnd("").isEmpty)
869 | assert(nullString.ops.removeEnd(Some("a")).isEmpty)
870 |
871 | // StringUtils.removeEnd(*, null) = *
872 | assert("".ops.removeEnd(nullString).contains(""))
873 | assert(Some("").ops.removeEnd("").contains(""))
874 | assert("".ops.removeEnd("a").contains(""))
875 |
876 | // All others:
877 | assert("www.domain.com.".ops.removeEnd(Some(".com")).contains("www.domain.com."))
878 | assert("www.domain.com".ops.removeEnd(".com").contains("www.domain"))
879 | assert("www.domain".ops.removeEnd(".com").contains("www.domain"))
880 | assert("domain.com".ops.removeEnd("").contains("domain.com"))
881 | assert("domain.com".ops.removeEnd(noneString).contains("domain.com"))
882 | }
883 |
884 | test("test string remove end ignore case") {
885 | assert(noneString.ops.removeEndIgnoreCase(nullString).isEmpty, "removeEndIgnoreCase(null, null)")
886 | assert(nullString.ops.removeEndIgnoreCase("").isEmpty, "removeEndIgnoreCase(null, \"\")")
887 | assert(nullString.ops.removeEndIgnoreCase("a").isEmpty, "removeEndIgnoreCase(null, \"a\")")
888 |
889 | // StringUtils.removeEnd(*, null) = *
890 | assert("".ops.removeEndIgnoreCase(nullString).contains(""), "removeEndIgnoreCase(\"\", null)")
891 | assert("".ops.removeEndIgnoreCase("").contains(""), "removeEndIgnoreCase(\"\", \"\")")
892 | assert("".ops.removeEndIgnoreCase("a").contains(""), "removeEndIgnoreCase(\"\", \"a\")")
893 |
894 | // All others:
895 | assert(
896 | "www.domain.com.".ops.removeEndIgnoreCase(".com") contains "www.domain.com.",
897 | "removeEndIgnoreCase(\"www.domain.com.\", \".com\")"
898 | )
899 | assert("www.domain.com".ops.removeEndIgnoreCase(".com").contains("www.domain"), "removeEndIgnoreCase(\"www.domain.com\", \".com\")")
900 | assert("www.domain".ops.removeEndIgnoreCase(".com") contains "www.domain", "removeEndIgnoreCase(\"www.domain\", \".com\")")
901 | assert("domain.com".ops.removeEndIgnoreCase("") contains "domain.com", "removeEndIgnoreCase(\"domain.com\", \"\")")
902 | assert("domain.com".ops.removeEndIgnoreCase(nullString) contains "domain.com", "removeEndIgnoreCase(\"domain.com\", null)")
903 |
904 | // Case insensitive:
905 | assert("www.domain.com".ops.removeEndIgnoreCase(".COM") contains "www.domain", "removeEndIgnoreCase(\"www.domain.com\", \".COM\")")
906 | assert("www.domain.COM".ops.removeEndIgnoreCase(".com") contains "www.domain", "removeEndIgnoreCase(\"www.domain.COM\", \".com\")")
907 | }
908 |
909 | test("string test remove ignore case") {
910 | // StringUtils.removeIgnoreCase(null, *) = null
911 | assert(noneString.ops.removeIgnoreCase(nullString).isEmpty)
912 | assert(nullString.ops.removeIgnoreCase("").isEmpty)
913 | assert(noneString.ops.removeIgnoreCase("a").isEmpty)
914 |
915 | // StringUtils.removeIgnoreCase("", *) = ""
916 | assert("".ops.removeIgnoreCase(nullString).contains(""))
917 | assert("".ops.removeIgnoreCase(noneString).contains(""))
918 | assert("".ops.removeIgnoreCase("a").contains(""))
919 |
920 | // StringUtils.removeIgnoreCase(*, null) = *
921 | assert(nullString.ops.removeIgnoreCase(nullString).isEmpty)
922 | assert("".ops.removeIgnoreCase(noneString).contains(""))
923 | assert("a".ops.removeIgnoreCase(nullString).contains("a"))
924 |
925 | // StringUtils.removeIgnoreCase(*, "") = *
926 | assert(nullString.ops.removeIgnoreCase("").isEmpty)
927 | assert("".ops.removeIgnoreCase(Some("")).contains(""))
928 | assert("a".ops.removeIgnoreCase(Some("")).contains("a"))
929 |
930 | // StringUtils.removeIgnoreCase("queued", "ue") = "qd"
931 | assert("queued".ops.removeIgnoreCase("ue").contains("qd"))
932 |
933 | // StringUtils.removeIgnoreCase("queued", "zz") = "queued"
934 | assert("queued".ops.removeIgnoreCase("zz").contains("queued"))
935 |
936 | // IgnoreCase
937 | // StringUtils.removeIgnoreCase("quEUed", "UE") = "qd"
938 | assert("quEUed".ops.removeIgnoreCase("UE").contains("qd"))
939 |
940 | // StringUtils.removeIgnoreCase("queued", "zZ") = "queued"
941 | assert(Some("queued").ops.removeIgnoreCase("zZ").contains("queued"))
942 |
943 | // StringUtils.removeIgnoreCase("\u0130x", "x") = "\u0130"
944 | assert("\u0130x".ops.removeIgnoreCase("x").contains("\u0130"))
945 |
946 | // LANG-1453
947 | "İa".ops.removeIgnoreCase("a")
948 | }
949 |
950 | test("test string remove start") {
951 | // StringUtils.removeStart("", *) = ""
952 | assert(nullString.ops.removeStart(noneString).isEmpty)
953 | assert(nullString.ops.removeStart("").isEmpty)
954 | assert(noneString.ops.removeStart("a").isEmpty)
955 |
956 | // StringUtils.removeStart(*, null) = *
957 | assert("".ops.removeStart(nullString) contains "")
958 | assert("".ops.removeStart("") contains "")
959 | assert("".ops.removeStart("a") contains "")
960 |
961 | // All others:
962 | assert(Some("www.domain.com").ops.removeStart(Some("www.")) contains "domain.com")
963 | assert("domain.com".ops.removeStart("www.") contains "domain.com")
964 | assert("domain.com".ops.removeStart("").contains("domain.com"))
965 | assert("domain.com".ops.removeStart(noneString).contains("domain.com"))
966 | }
967 |
968 | test("test string remove start ignore case") {
969 | // StringUtils.removeStart("", *) = ""
970 | assert(nullString.ops.removeStartIgnoreCase(nullString).isEmpty, "removeStartIgnoreCase(null, null)")
971 | assert(noneString.ops.removeStartIgnoreCase(Some("")).isEmpty, "removeStartIgnoreCase(null, \"\")")
972 | assert(nullString.ops.removeStartIgnoreCase("a").isEmpty, "removeStartIgnoreCase(null, \"a\")")
973 |
974 | // StringUtils.removeStart(*, null) = *
975 | assert("".ops.removeStartIgnoreCase(nullString).contains(""), "removeStartIgnoreCase(\"\", null)")
976 | assert("".ops.removeStartIgnoreCase("").contains(""), "removeStartIgnoreCase(\"\", \"\")")
977 | assert("".ops.removeStartIgnoreCase("a").contains(""), "removeStartIgnoreCase(\"\", \"a\")")
978 |
979 | // All others:
980 | assert("www.domain.com".ops.removeStartIgnoreCase("www.") contains "domain.com", "removeStartIgnoreCase(\"www.domain.com\", \"www.\")")
981 | assert("domain.com".ops.removeStartIgnoreCase("www.") contains "domain.com", "removeStartIgnoreCase(\"domain.com\", \"www.\")")
982 | assert(Some("domain.com").ops.removeStartIgnoreCase("") contains "domain.com", "removeStartIgnoreCase(\"domain.com\", \"\")")
983 | assert("domain.com".ops.removeStartIgnoreCase(nullString) contains "domain.com", "removeStartIgnoreCase(\"domain.com\", null)")
984 |
985 | // Case insensitive:
986 | assert("www.domain.com".ops.removeStartIgnoreCase("WWW.").contains("domain.com"), "removeStartIgnoreCase(\"www.domain.com\", \"WWW.\")")
987 |
988 | }
989 |
990 | test("test string repeat with repeat times") {
991 | assert(noneString.ops.repeat(2).isEmpty)
992 | assert(Some("ab").ops.repeat(0).contains(""))
993 | assert("".ops.repeat(3).contains(""))
994 | assert("a".ops.repeat(3).contains("aaa"))
995 | assert("a".ops.repeat(-2).contains(""))
996 | assert("ab".ops.repeat(3).contains("ababab"))
997 | assert("abc".ops.repeat(3).contains("abcabcabc"))
998 | val str = "a".ops.repeat(10000) // bigger than pad limit
999 | assert(10000 == str.get.length)
1000 | assert(str.ops.containsOnly('a'))
1001 | }
1002 |
1003 | test("test string repeat separator and times") {
1004 | assert(noneString.ops.repeat(noneString, 2).isEmpty)
1005 | assert(nullString.ops.repeat("x", 2).isEmpty)
1006 | assert("".ops.repeat(nullString, 2).contains(""))
1007 |
1008 | assert("ab".ops.repeat("", 0).contains(""))
1009 | assert("".ops.repeat("", 2).contains(""))
1010 |
1011 | assert("".ops.repeat("x", 3).contains("xx"))
1012 |
1013 | assert("?".ops.repeat(", ", 3).contains("?, ?, ?"))
1014 | }
1015 |
1016 | test("test string replace string array to string array") {
1017 | // JAVADOC TESTS START
1018 | assert(nullString.ops.replaceEach(Array[String]("a"), Array[String]("b")).isEmpty)
1019 | assert("".ops.replaceEach(Array[String]("a"), Array[String]("b")) contains "")
1020 | assert("aba".ops.replaceEach(null, null) contains "aba")
1021 | assert("aba".ops.replaceEach(new Array[String](0), null) contains "aba")
1022 | assert(Some("aba").ops.replaceEach(null, new Array[String](0)) contains "aba")
1023 | assert("aba".ops.replaceEach(Array[String]("a"), null) contains "aba")
1024 |
1025 | assert("aba".ops.replaceEach(Array[String]("a"), Array[String]("")) contains "b")
1026 | assert("aba".ops.replaceEach(Array[String](null), Array[String]("a")) contains "aba")
1027 | assert("abcde".ops.replaceEach(Array[String]("ab", "d"), Array[String]("w", "t")) contains "wcte")
1028 | assert("abcde".ops.replaceEach(Array[String]("ab", "d"), Array[String]("d", "t")) contains "dcte")
1029 | // JAVADOC TESTS END
1030 |
1031 | assert("abc".ops.replaceEach(Array[String]("a", "b"), Array[String]("b", "c")) contains "bcc")
1032 | assert(
1033 | "d216.102oren".ops
1034 | .replaceEach(
1035 | Array[String](
1036 | "a",
1037 | "b",
1038 | "c",
1039 | "d",
1040 | "e",
1041 | "f",
1042 | "g",
1043 | "h",
1044 | "i",
1045 | "j",
1046 | "k",
1047 | "l",
1048 | "m",
1049 | "n",
1050 | "o",
1051 | "p",
1052 | "q",
1053 | "r",
1054 | "s",
1055 | "t",
1056 | "u",
1057 | "v",
1058 | "w",
1059 | "x",
1060 | "y",
1061 | "z",
1062 | "A",
1063 | "B",
1064 | "C",
1065 | "D",
1066 | "E",
1067 | "F",
1068 | "G",
1069 | "H",
1070 | "I",
1071 | "J",
1072 | "K",
1073 | "L",
1074 | "M",
1075 | "N",
1076 | "O",
1077 | "P",
1078 | "Q",
1079 | "R",
1080 | "S",
1081 | "T",
1082 | "U",
1083 | "V",
1084 | "W",
1085 | "X",
1086 | "Y",
1087 | "Z",
1088 | "1",
1089 | "2",
1090 | "3",
1091 | "4",
1092 | "5",
1093 | "6",
1094 | "7",
1095 | "8",
1096 | "9"
1097 | ),
1098 | Array[String](
1099 | "n",
1100 | "o",
1101 | "p",
1102 | "q",
1103 | "r",
1104 | "s",
1105 | "t",
1106 | "u",
1107 | "v",
1108 | "w",
1109 | "x",
1110 | "y",
1111 | "z",
1112 | "a",
1113 | "b",
1114 | "c",
1115 | "d",
1116 | "e",
1117 | "f",
1118 | "g",
1119 | "h",
1120 | "i",
1121 | "j",
1122 | "k",
1123 | "l",
1124 | "m",
1125 | "N",
1126 | "O",
1127 | "P",
1128 | "Q",
1129 | "R",
1130 | "S",
1131 | "T",
1132 | "U",
1133 | "V",
1134 | "W",
1135 | "X",
1136 | "Y",
1137 | "Z",
1138 | "A",
1139 | "B",
1140 | "C",
1141 | "D",
1142 | "E",
1143 | "F",
1144 | "G",
1145 | "H",
1146 | "I",
1147 | "J",
1148 | "K",
1149 | "L",
1150 | "M",
1151 | "5",
1152 | "6",
1153 | "7",
1154 | "8",
1155 | "9",
1156 | "1",
1157 | "2",
1158 | "3",
1159 | "4"
1160 | )
1161 | )
1162 | .contains("q651.506bera")
1163 | )
1164 |
1165 | // Test null safety inside arrays - LANG-552
1166 | assert("aba".ops.replaceEach(Array[String]("a"), Array[String](null)) contains "aba")
1167 | assert("aba".ops.replaceEach(Array[String]("a", "b"), Array[String]("c", null)) contains "cbc")
1168 |
1169 | assertThrows[IllegalArgumentException] {
1170 | "abba".ops.replaceEach(Array[String]("a"), Array[String]("b", "a"))
1171 | }
1172 | }
1173 |
1174 | test("test string replace string to string") {
1175 | assert(nullString.ops.replace(nullString, noneString).isEmpty)
1176 | assert(noneString.ops.replace(nullString, "any").isEmpty)
1177 | assert(nullString.ops.replace("any", null).isEmpty)
1178 | assert(nullString.ops.replace("any", "any").isEmpty)
1179 |
1180 | assert(Some("").ops.replace(nullString, nullString).contains(""))
1181 | assert("".ops.replace(noneString, "any").contains(""))
1182 | assert("".ops.replace("any", nullString).contains(""))
1183 | assert("".ops.replace(Some("any"), Some("any")).contains(""))
1184 |
1185 | assert("FOO".ops.replace("", "any").contains("FOO"))
1186 | assert("FOO".ops.replace(nullString, "any").contains("FOO"))
1187 | assert("FOO".ops.replace("F", nullString).contains("FOO"))
1188 | assert("FOO".ops.replace(noneString, null).contains("FOO"))
1189 |
1190 | assert("foofoofoo".ops.replace("foo", "").contains(""))
1191 | assert(Some("foofoofoo").ops.replace("foo", "bar").contains("barbarbar"))
1192 | assert("foofoofoo".ops.replace("oo", "ar").contains("farfarfar"))
1193 | }
1194 |
1195 | test("test string replace string to string with max times") {
1196 | assert(nullString.ops.replace(noneString, noneString, 2).isEmpty)
1197 | assert(noneString.ops.replace(nullString, Some("any"), 2).isEmpty)
1198 | assert(nullString.ops.replace(Some("any"), noneString, 2).isEmpty)
1199 | assert(nullString.ops.replace("any", "any", 2).isEmpty)
1200 |
1201 | assert("".ops.replace(noneString, noneString, 2).contains(""))
1202 | assert("".ops.replace(noneString, "any", 2).contains(""))
1203 | assert(Some("").ops.replace("any", noneString, 2).contains(""))
1204 | assert("".ops.replace("any", "any", 2).contains(""))
1205 |
1206 | val str = new String(Array[Char]('o', 'o', 'f', 'o', 'o'))
1207 | assert(str.ops.replace("x", "", -1).contains(str))
1208 |
1209 | assert("oofoo".ops.replace("o", "", -1).contains("f"))
1210 | assert("oofoo".ops.replace("o", "", 0).contains("oofoo"))
1211 | assert(Some("oofoo").ops.replace("o", "", 1).contains("ofoo"))
1212 | assert("oofoo".ops.replace("o", "", 2).contains("foo"))
1213 | assert("oofoo".ops.replace("o", "", 3).contains("fo"))
1214 | assert("oofoo".ops.replace("o", "", 4).contains("f"))
1215 |
1216 | assert("oofoo".ops.replace("o", "", -5).contains("f"))
1217 | assert("oofoo".ops.replace("o", "", 1000).contains("f"))
1218 | }
1219 |
1220 | test("test string replace string char to char") {
1221 | assert(nullString.ops.replaceChars('b', 'z').isEmpty)
1222 | assert("".ops.replaceChars('b', 'z').contains(""))
1223 | assert("abcba".ops.replaceChars('b', 'z').contains("azcza"))
1224 | assert("abcba".ops.replaceChars('x', 'z').contains("abcba"))
1225 | }
1226 |
1227 | test("test string replace chars string to chars string") {
1228 | assert(nullString.ops.replaceChars(nullString, nullString).isEmpty)
1229 | assert(noneString.ops.replaceChars("", null).isEmpty)
1230 | assert(nullString.ops.replaceChars("a", noneString).isEmpty)
1231 | assert(nullString.ops.replaceChars(nullString, "").isEmpty)
1232 | assert(nullString.ops.replaceChars(noneString, Some("x")).isEmpty)
1233 |
1234 | assert("".ops.replaceChars(noneString, noneString).contains(""))
1235 | assert("".ops.replaceChars("", noneString).contains(""))
1236 | assert("".ops.replaceChars("a", nullString).contains(""))
1237 | assert("".ops.replaceChars(nullString, "").contains(""))
1238 | assert("".ops.replaceChars(nullString, "x").contains(""))
1239 |
1240 | assert(Some("abc").ops.replaceChars(noneString, nullString).contains("abc"))
1241 | assert("abc".ops.replaceChars(nullString, "").contains("abc"))
1242 | assert("abc".ops.replaceChars(nullString, "x").contains("abc"))
1243 |
1244 | assert("abc".ops.replaceChars("", nullString).contains("abc"))
1245 | assert("abc".ops.replaceChars("", "").contains("abc"))
1246 | assert("abc".ops.replaceChars(Some(""), Some("x")).contains("abc"))
1247 |
1248 | assert("abc".ops.replaceChars("b", null).contains("ac"))
1249 | assert("abc".ops.replaceChars("b", "").contains("ac"))
1250 | assert("abc".ops.replaceChars("b", "x").contains("axc"))
1251 |
1252 | assert("abcba".ops.replaceChars("bc", "yz").contains("ayzya"))
1253 | assert("abcba".ops.replaceChars("bc", "y").contains("ayya"))
1254 | assert("abcba".ops.replaceChars("bc", "yzx").contains("ayzya"))
1255 |
1256 | assert("abcba".ops.replaceChars("z", "w").contains("abcba"))
1257 | assert("abcba".ops.replaceChars("z", "w").contains("abcba"))
1258 |
1259 | // Javadoc examples:
1260 | assert(Some("hello").ops.replaceChars("ho", "jy").contains("jelly"))
1261 | assert("abcba".ops.replaceChars("bc", "yz").contains("ayzya"))
1262 | assert("abcba".ops.replaceChars("bc", "y").contains("ayya"))
1263 | assert("abcba".ops.replaceChars("bc", "yzx").contains("ayzya"))
1264 |
1265 | // From https://issues.apache.org/bugzilla/show_bug.cgi?id=25454
1266 | assert("abc".ops.replaceChars("ab", "bc").contains("bcc"))
1267 | assert(
1268 | "d216.102oren".ops
1269 | .replaceChars(
1270 | "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789",
1271 | "nopqrstuvwxyzabcdefghijklmNOPQRSTUVWXYZABCDEFGHIJKLM567891234"
1272 | )
1273 | .contains("q651.506bera")
1274 | )
1275 | }
1276 |
1277 | test("test string replace ignore case from string to string") {
1278 | assert(nullString.ops.replaceIgnoreCase(noneString, noneString).isEmpty)
1279 | assert(noneString.ops.replaceIgnoreCase(nullString, Some("any")).isEmpty)
1280 | assert(nullString.ops.replaceIgnoreCase("any", nullString).isEmpty)
1281 | assert(nullString.ops.replaceIgnoreCase("any", "any").isEmpty)
1282 |
1283 | assert("".ops.replaceIgnoreCase(nullString, nullString).contains(""))
1284 | assert(Some("").ops.replaceIgnoreCase(noneString, "any").contains(""))
1285 | assert("".ops.replaceIgnoreCase("any", nullString).contains(""))
1286 | assert("".ops.replaceIgnoreCase("any", "any").contains(""))
1287 |
1288 | assert("FOO".ops.replaceIgnoreCase("", "any").contains("FOO"))
1289 | assert("FOO".ops.replaceIgnoreCase(noneString, "any").contains("FOO"))
1290 | assert("FOO".ops.replaceIgnoreCase("F", nullString).contains("FOO"))
1291 | assert("FOO".ops.replaceIgnoreCase(nullString, nullString).contains("FOO"))
1292 |
1293 | assert("foofoofoo".ops.replaceIgnoreCase("foo", "").contains(""))
1294 | assert("foofoofoo".ops.replaceIgnoreCase("foo", "bar").contains("barbarbar"))
1295 | assert("foofoofoo".ops.replaceIgnoreCase("oo", "ar").contains("farfarfar"))
1296 |
1297 | // IgnoreCase
1298 | assert(Some("foofoofoo").ops.replaceIgnoreCase("FOO", "").contains(""))
1299 | assert("fooFOOfoo".ops.replaceIgnoreCase("foo", "bar").contains("barbarbar"))
1300 | assert("foofOOfoo".ops.replaceIgnoreCase("OO", Some("ar")).contains("farfarfar"))
1301 | }
1302 |
1303 | test("test string replace ignore case from string to string max times") {
1304 | assert(noneString.ops.replaceIgnoreCase(nullString, nullString, 2).isEmpty)
1305 | assert(nullString.ops.replaceIgnoreCase(nullString, Some("any"), 2).isEmpty)
1306 | assert(nullString.ops.replaceIgnoreCase("any", noneString, 2).isEmpty)
1307 | assert(noneString.ops.replaceIgnoreCase(Some("any"), "any", 2).isEmpty)
1308 |
1309 | assert(Some("").ops.replaceIgnoreCase(nullString, nullString, 2).contains(""))
1310 | assert("".ops.replaceIgnoreCase(nullString, "any", 2).contains(""))
1311 | assert("".ops.replaceIgnoreCase("any", nullString, 2).contains(""))
1312 | assert("".ops.replaceIgnoreCase("any", "any", 2).contains(""))
1313 |
1314 | val str = new String(Array[Char]('o', 'o', 'f', 'o', 'o'))
1315 | assert(Some(str).ops.replaceIgnoreCase("x", "", -1).contains(str))
1316 |
1317 | assert("oofoo".ops.replaceIgnoreCase("o", "", -1).contains("f"))
1318 | assert(Some("oofoo").ops.replaceIgnoreCase("o", "", 0).contains("oofoo"))
1319 | assert("oofoo".ops.replaceIgnoreCase("o", "", 1).contains("ofoo"))
1320 | assert("oofoo".ops.replaceIgnoreCase("o", "", 2).contains("foo"))
1321 | assert("oofoo".ops.replaceIgnoreCase("o", "", 3).contains("fo"))
1322 | assert("oofoo".ops.replaceIgnoreCase("o", "", 4).contains("f"))
1323 |
1324 | assert("oofoo".ops.replaceIgnoreCase("o", "", -5).contains("f"))
1325 | assert("oofoo".ops.replaceIgnoreCase("o", "", 1000).contains("f"))
1326 |
1327 | // IgnoreCase
1328 | assert("oofoo".ops.replaceIgnoreCase("O", "", -1).contains("f"))
1329 | assert("oofoo".ops.replaceIgnoreCase("O", "", 0).contains("oofoo"))
1330 | assert("oofoo".ops.replaceIgnoreCase("O", "", 1).contains("ofoo"))
1331 | assert("oofoo".ops.replaceIgnoreCase("O", "", 2).contains("foo"))
1332 | assert("oofoo".ops.replaceIgnoreCase("O", "", 3).contains("fo"))
1333 | assert("oofoo".ops.replaceIgnoreCase("O", "", 4).contains("f"))
1334 |
1335 | assert("oofoo".ops.replaceIgnoreCase("O", "", -5).contains("f"))
1336 | assert("oofoo".ops.replaceIgnoreCase("O", "", 1000).contains("f"))
1337 |
1338 | }
1339 |
1340 | test("test string replace once from string to string") {
1341 | assert(noneString.ops.replaceOnce(nullString, nullString).isEmpty)
1342 | assert(nullString.ops.replaceOnce(nullString, "any").isEmpty)
1343 | assert(nullString.ops.replaceOnce("any", null).isEmpty)
1344 | assert(nullString.ops.replaceOnce("any", "any").isEmpty)
1345 |
1346 | assert("".ops.replaceOnce(nullString, nullString).contains(""))
1347 | assert(Some("").ops.replaceOnce(noneString, "any").contains(""))
1348 | assert("".ops.replaceOnce(Some("any"), noneString).contains(""))
1349 | assert("".ops.replaceOnce("any", "any").contains(""))
1350 |
1351 | assert("FOO".ops.replaceOnce("", "any").contains("FOO"))
1352 | assert("FOO".ops.replaceOnce(nullString, "any").contains("FOO"))
1353 | assert("FOO".ops.replaceOnce("F", nullString).contains("FOO"))
1354 | assert("FOO".ops.replaceOnce(nullString, nullString).contains("FOO"))
1355 |
1356 | assert("foofoofoo".ops.replaceOnce("foo", "").contains("foofoo"))
1357 | }
1358 |
1359 | test("test string replace once ignore case from string to string") {
1360 | assert(nullString.ops.replaceOnceIgnoreCase(nullString, nullString).isEmpty)
1361 | assert(noneString.ops.replaceOnceIgnoreCase(nullString, "any").isEmpty)
1362 | assert(nullString.ops.replaceOnceIgnoreCase(noneString, "any").isEmpty)
1363 | assert(noneString.ops.replaceOnceIgnoreCase("any", "any").isEmpty)
1364 |
1365 | assert("".ops.replaceOnceIgnoreCase(noneString, noneString).contains(""))
1366 | assert("".ops.replaceOnceIgnoreCase(noneString, "any").contains(""))
1367 | assert("".ops.replaceOnceIgnoreCase("any", nullString).contains(""))
1368 | assert(Some("").ops.replaceOnceIgnoreCase(Some("any"), Some("any")).contains(""))
1369 |
1370 | assert("FOO".ops.replaceOnceIgnoreCase("", "any").contains("FOO"))
1371 | assert("FOO".ops.replaceOnceIgnoreCase(nullString, "any").contains("FOO"))
1372 | assert("FOO".ops.replaceOnceIgnoreCase("F", null).contains("FOO"))
1373 | assert("FOO".ops.replaceOnceIgnoreCase(nullString, nullString).contains("FOO"))
1374 |
1375 | assert("foofoofoo".ops.replaceOnceIgnoreCase("foo", "").contains("foofoo"))
1376 |
1377 | // Ignore Case
1378 | assert("FoOFoofoo".ops.replaceOnceIgnoreCase("foo", "").contains("Foofoo"))
1379 | }
1380 |
1381 | test("test string reverse") {
1382 | assert(noneString.ops.reverse.isEmpty)
1383 | assert("".ops.reverse.contains(""))
1384 | assert(Some("backwards").ops.reverse.contains("sdrawkcab"))
1385 | }
1386 |
1387 | test("test string reverse delimited") {
1388 | assert(nullString.ops.reverseDelimited('.').isEmpty)
1389 | assert("".ops.reverseDelimited('.').contains(""))
1390 | assert("a.b.c".ops.reverseDelimited('.').contains("c.b.a"))
1391 | assert("a b c".ops.reverseDelimited('.').contains("a b c"))
1392 | assert("".ops.reverseDelimited('.').contains(""))
1393 | }
1394 |
1395 | test("test string right pad with size") {
1396 | assert(nullString.ops.rightPad(5).isEmpty)
1397 | assert(Some("").ops.rightPad(5).contains(" "))
1398 | assert("abc".ops.rightPad(5).contains("abc "))
1399 | assert("abc".ops.rightPad(2).contains("abc"))
1400 | assert(Some("abc").ops.rightPad(-1).contains("abc"))
1401 | }
1402 |
1403 | test("test string right pad with size and pad char") {
1404 | assert(nullString.ops.rightPad(5, ' ').isEmpty)
1405 | assert("".ops.rightPad(5, ' ').contains(" "))
1406 | assert(Some("abc").ops.rightPad(5, ' ').contains("abc "))
1407 | assert("abc".ops.rightPad(2, ' ').contains("abc"))
1408 | assert("abc".ops.rightPad(-1, ' ').contains("abc"))
1409 | assert("abc".ops.rightPad(5, 'x').contains("abcxx"))
1410 | val str = "aaa".ops.rightPad(10000, 'a') // bigger than pad length
1411 | assert(str.get.length == 10000)
1412 | assert(str.ops.containsOnly('a'))
1413 | }
1414 |
1415 | test("test string right pad with size and pad string") {
1416 | assert(nullString.ops.rightPad(5, "-+").isEmpty)
1417 | assert("".ops.rightPad(5, " ").contains(" "))
1418 | assert(noneString.ops.rightPad(8, null).isEmpty)
1419 | assert("abc".ops.rightPad(7, Some("-+")).contains("abc-+-+"))
1420 | assert("abc".ops.rightPad(6, "-+~").contains("abc-+~"))
1421 | assert("abc".ops.rightPad(5, "-+~").contains("abc-+"))
1422 | assert("abc".ops.rightPad(2, " ").contains("abc"))
1423 | assert(Some("abc").ops.rightPad(-1, " ").contains("abc"))
1424 | assert("abc".ops.rightPad(5, null).contains("abc "))
1425 | assert("abc".ops.rightPad(5, "").contains("abc "))
1426 | }
1427 |
1428 | test("test string rotate with shift") {
1429 | assert(nullString.ops.rotate(1).isEmpty)
1430 | assert("".ops.rotate(1).contains(""))
1431 | assert(Some("abcdefg").ops.rotate(0).contains("abcdefg"))
1432 | assert("abcdefg".ops.rotate(2).contains("fgabcde"))
1433 | assert("abcdefg".ops.rotate(-2).contains("cdefgab"))
1434 | assert("abcdefg".ops.rotate(7).contains("abcdefg"))
1435 | assert("abcdefg".ops.rotate(-7).contains("abcdefg"))
1436 | assert("abcdefg".ops.rotate(9).contains("fgabcde"))
1437 | assert("abcdefg".ops.rotate(-9).contains("cdefgab"))
1438 | assert("abcdefg".ops.rotate(17).contains("efgabcd"))
1439 | assert("abcdefg".ops.rotate(-17).contains("defgabc"))
1440 | }
1441 |
1442 | test("test string split") {
1443 | assert(nullString.ops.split.isEmpty)
1444 | assert("".ops.split.exists(_.length == 0))
1445 |
1446 | val str1 = "a b .c"
1447 | val res1 = str1.ops.split
1448 | assert(res1.exists(_.length == 3))
1449 | assert(res1.exists(elements => elements.head == "a"))
1450 | assert(res1.exists(elements => elements(1) == "b"))
1451 | assert(res1.exists(elements => elements(2) == ".c"))
1452 |
1453 | val str2 = " a "
1454 | val res2 = str2.ops.split.get
1455 | assert(1 == res2.length)
1456 | assert("a" == res2.head)
1457 |
1458 | val str3 = "a" + WHITESPACE + "b" + NON_WHITESPACE + "c"
1459 | val res3 = str3.ops.split.get
1460 | assert(2 == res3.length)
1461 | assert("a" == res3.head)
1462 | assert("b" + NON_WHITESPACE + "c" == res3(1))
1463 | }
1464 |
1465 | test("test string split with separator char") {
1466 | assert(noneString.ops.split('.').isEmpty)
1467 | assert(Some("").ops.split('.').exists(_.length == 0))
1468 |
1469 | val str1 = "a.b.. c"
1470 | val res1 = str1.ops.split('.').get
1471 | assert(3 == res1.length)
1472 | assert("a" == res1.head)
1473 | assert("b" == res1(1))
1474 | assert(" c" == res1.last)
1475 |
1476 | val str2 = ".a."
1477 | val res2 = str2.ops.split('.').get
1478 | assert(res2.length == 1)
1479 | assert("a" == res2.head)
1480 |
1481 | val str3 = "a b c"
1482 | val res3 = str3.ops.split(' ').get
1483 | assert(3 == res3.length)
1484 | assert("a" == res3.head)
1485 | assert("b" == res3(1))
1486 | assert("c" == res3.last)
1487 | }
1488 |
1489 | test("test string split with separator chars string and max times") {
1490 | assert(nullString.ops.split(".").isEmpty)
1491 | assert(noneString.ops.split(".", 3).isEmpty)
1492 |
1493 | assert("".ops.split(".").exists(_.length == 0))
1494 | assert("".ops.split(".", 3).exists(_.length == 0))
1495 |
1496 | innerTestSplit('.', ".", ' ')
1497 | innerTestSplit('.', ".", ',')
1498 | innerTestSplit('.', ".,", 'x')
1499 | for (i <- 0 until WHITESPACE.length) {
1500 | for (j <- 0 until NON_WHITESPACE.length) {
1501 | innerTestSplit(WHITESPACE.charAt(i), null, NON_WHITESPACE.charAt(j))
1502 | innerTestSplit(WHITESPACE.charAt(i), String.valueOf(WHITESPACE.charAt(i)), NON_WHITESPACE.charAt(j))
1503 | }
1504 | }
1505 |
1506 | val expectedResults = Array("ab", "de fg")
1507 | val results1 = "ab de fg".ops.split(null, 2).get
1508 | assert(expectedResults.length == results1.length)
1509 | for (i <- expectedResults.indices) {
1510 | assert(expectedResults(i) == results1(i))
1511 | }
1512 |
1513 | val expectedResults2 = Array("ab", "cd:ef")
1514 | val results2 = "ab:cd:ef".ops.split(":", 2).get
1515 | assert(expectedResults2.length == results2.length)
1516 | for (i <- expectedResults2.indices) {
1517 | assert(expectedResults2(i) == results2(i))
1518 | }
1519 | }
1520 |
1521 | test("test string split by character type") {
1522 | assert(nullString.ops.splitByCharacterType.isEmpty)
1523 | assert("".ops.splitByCharacterType.exists(_.length == 0))
1524 |
1525 | assert("ab de fg".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("ab", " ", "de", " ", "fg"), _)))
1526 |
1527 | assert(Some("ab de fg").ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("ab", " ", "de", " ", "fg"), _)))
1528 |
1529 | assert("ab:cd:ef".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("ab", ":", "cd", ":", "ef"), _)))
1530 |
1531 | assert("number5".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("number", "5"), _)))
1532 |
1533 | assert("fooBar".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("foo", "B", "ar"), _)))
1534 |
1535 | assert("foo200Bar".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("foo", "200", "B", "ar"), _)))
1536 |
1537 | assert("ASFRules".ops.splitByCharacterType.exists(Objects.deepEquals(Array[String]("ASFR", "ules"), _)))
1538 | }
1539 |
1540 | test("test string split by character type camel case") {
1541 | assert(noneString.ops.splitByCharacterTypeCamelCase.isEmpty)
1542 | assert("".ops.splitByCharacterTypeCamelCase.exists(_.length == 0))
1543 |
1544 | assert("ab de fg".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("ab", " ", "de", " ", "fg"), _)))
1545 |
1546 | assert("ab de fg".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("ab", " ", "de", " ", "fg"), _)))
1547 |
1548 | assert(Some("ab:cd:ef").ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("ab", ":", "cd", ":", "ef"), _)))
1549 |
1550 | assert("number5".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("number", "5"), _)))
1551 |
1552 | assert("fooBar".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("foo", "Bar"), _)))
1553 |
1554 | assert("foo200Bar".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("foo", "200", "Bar"), _)))
1555 |
1556 | assert("ASFRules".ops.splitByCharacterTypeCamelCase.exists(Objects.deepEquals(Array[String]("ASF", "Rules"), _)))
1557 | }
1558 |
1559 | test("test string split by whole separator preserve all tokens string") {
1560 | assert(nullString.ops.splitByWholeSeparatorPreserveAllTokens(".").isEmpty)
1561 |
1562 | assert("".ops.splitByWholeSeparatorPreserveAllTokens(".").exists(_.length == 0))
1563 |
1564 | // test whitespace
1565 | var input = "ab de fg"
1566 | var expected = Array[String]("ab", "", "", "de", "fg")
1567 |
1568 | var actual = input.ops.splitByWholeSeparatorPreserveAllTokens(null).get
1569 | assert(expected.length == actual.length)
1570 | for (i <- actual.indices) {
1571 | assert(expected(i) == actual(i))
1572 | }
1573 |
1574 | // test delimiter singlechar
1575 | input = "1::2:::3::::4"
1576 | expected = Array[String]("1", "", "2", "", "", "3", "", "", "", "4")
1577 |
1578 | actual = input.ops.splitByWholeSeparatorPreserveAllTokens(":").get
1579 | assert(expected.length == actual.length)
1580 | for (i <- actual.indices) {
1581 | assert(expected(i) == actual(i))
1582 | }
1583 |
1584 | // test delimiter multichar
1585 | input = "1::2:::3::::4"
1586 | expected = Array[String]("1", "2", ":3", "", "4")
1587 |
1588 | actual = input.ops.splitByWholeSeparatorPreserveAllTokens("::").get
1589 | assert(expected.length == actual.length)
1590 | for (i <- actual.indices) {
1591 | assert(expected(i) == actual(i))
1592 | }
1593 | }
1594 |
1595 | test("test string split by whole separator preserve all tokens with separator and max times") {
1596 | assert(nullString.ops.splitByWholeSeparatorPreserveAllTokens(".", -1).isEmpty)
1597 |
1598 | assert(Some("").ops.splitByWholeSeparatorPreserveAllTokens(".", -1).exists(_.length == 0))
1599 |
1600 | // test whitespace
1601 | var input = "ab de fg"
1602 | var expected = Array[String]("ab", "", "", "de", "fg")
1603 |
1604 | var actual = input.ops.splitByWholeSeparatorPreserveAllTokens(noneString, -1).get
1605 | assert(expected.length == actual.length)
1606 | for (i <- actual.indices) {
1607 | assert(expected(i) == actual(i))
1608 | }
1609 |
1610 | // test delimiter singlechar
1611 | input = "1::2:::3::::4"
1612 | expected = Array[String]("1", "", "2", "", "", "3", "", "", "", "4")
1613 |
1614 | actual = input.ops.splitByWholeSeparatorPreserveAllTokens(Some(":"), -1).get
1615 | assert(expected.length == actual.length)
1616 | for (i <- actual.indices) {
1617 | assert(expected(i) == actual(i))
1618 | }
1619 |
1620 | // test delimiter multichar
1621 | input = "1::2:::3::::4"
1622 | expected = Array[String]("1", "2", ":3", "", "4")
1623 |
1624 | actual = input.ops.splitByWholeSeparatorPreserveAllTokens("::", -1).get
1625 | assert(expected.length == actual.length)
1626 | for (i <- actual.indices) {
1627 | assert(expected(i) == actual(i))
1628 | }
1629 |
1630 | // test delimiter char with max
1631 | input = "1::2::3:4"
1632 | expected = Array[String]("1", "", "2", ":3:4")
1633 |
1634 | actual = input.ops.splitByWholeSeparatorPreserveAllTokens(":", 4).get
1635 | assert(expected.length == actual.length)
1636 | for (i <- actual.indices) {
1637 | assert(expected(i) == actual(i))
1638 | }
1639 | }
1640 |
1641 | test("test string split by whole string separator") {
1642 | assert(nullString.ops.splitByWholeSeparator(".").isEmpty)
1643 |
1644 | assert("".ops.splitByWholeSeparator(".").exists(_.length == 0))
1645 |
1646 | val stringToSplitOnNulls = "ab de fg"
1647 | val splitOnNullExpectedResults = Array("ab", "de", "fg")
1648 |
1649 | val splitOnNullResults = stringToSplitOnNulls.ops.splitByWholeSeparator(null).get
1650 | assert(splitOnNullExpectedResults.length == splitOnNullResults.length)
1651 | for (i <- splitOnNullExpectedResults.indices) {
1652 | assert(splitOnNullExpectedResults(i) == splitOnNullResults(i))
1653 | }
1654 |
1655 | val stringToSplitOnCharactersAndString = "abstemiouslyaeiouyabstemiously"
1656 |
1657 | val splitOnStringExpectedResults = Array("abstemiously", "abstemiously")
1658 | val splitOnStringResults = stringToSplitOnCharactersAndString.ops.splitByWholeSeparator("aeiouy").get
1659 | assert(splitOnStringExpectedResults.length == splitOnStringResults.length)
1660 | for (i <- splitOnStringExpectedResults.indices) {
1661 | assert(splitOnStringExpectedResults(i) == splitOnStringResults(i))
1662 | }
1663 |
1664 | val splitWithMultipleSeparatorExpectedResults = Array("ab", "cd", "ef")
1665 | val splitWithMultipleSeparator = "ab:cd::ef".ops.splitByWholeSeparator(":").get
1666 | assert(splitWithMultipleSeparatorExpectedResults.length == splitWithMultipleSeparator.length)
1667 | for (i <- splitWithMultipleSeparatorExpectedResults.indices) {
1668 | assert(splitWithMultipleSeparatorExpectedResults(i) == splitWithMultipleSeparator(i))
1669 | }
1670 | }
1671 |
1672 | test("test split by whole string separator and max times") {
1673 | assert(noneString.ops.splitByWholeSeparator(".", 3).isEmpty)
1674 |
1675 | assert("".ops.splitByWholeSeparator(".", 3).exists(_.length == 0))
1676 |
1677 | val stringToSplitOnNulls = "ab de fg"
1678 | val splitOnNullExpectedResults = Array("ab", "de fg")
1679 | // String[] splitOnNullExpectedResults = { "ab", "de" } ;
1680 |
1681 | val splitOnNullResults = Some(stringToSplitOnNulls).ops.splitByWholeSeparator(null, 2).get
1682 | assert(splitOnNullExpectedResults.length == splitOnNullResults.length)
1683 | for (i <- splitOnNullExpectedResults.indices) {
1684 | assert(splitOnNullExpectedResults(i) == splitOnNullResults(i))
1685 | }
1686 |
1687 | val stringToSplitOnCharactersAndString = "abstemiouslyaeiouyabstemiouslyaeiouyabstemiously"
1688 |
1689 | val splitOnStringExpectedResults = Array("abstemiously", "abstemiouslyaeiouyabstemiously")
1690 | // String[] splitOnStringExpectedResults = { "abstemiously", "abstemiously" } ;
1691 | val splitOnStringResults = stringToSplitOnCharactersAndString.ops.splitByWholeSeparator("aeiouy", 2).get
1692 | assert(splitOnStringExpectedResults.length == splitOnStringResults.length)
1693 | for (i <- splitOnStringExpectedResults.indices) {
1694 | assert(splitOnStringExpectedResults(i) == splitOnStringResults(i))
1695 | }
1696 | }
1697 |
1698 | test("test string split preserve all tokens") {
1699 | assert(noneString.ops.splitPreserveAllTokens.isEmpty)
1700 | assert("".ops.splitPreserveAllTokens.exists(_.length == 0))
1701 |
1702 | var str = "abc def"
1703 | var res = Some(str).ops.splitPreserveAllTokens.get
1704 | assert(2 == res.length)
1705 | assert("abc" == res(0))
1706 | assert("def" == res(1))
1707 |
1708 | str = "abc def"
1709 | res = str.ops.splitPreserveAllTokens.get
1710 | assert(3 == res.length)
1711 | assert("abc" == res(0))
1712 | assert("" == res(1))
1713 | assert("def" == res(2))
1714 |
1715 | str = " abc "
1716 | res = str.ops.splitPreserveAllTokens.get
1717 | assert(3 == res.length)
1718 | assert("" == res(0))
1719 | assert("abc" == res(1))
1720 | assert("" == res(2))
1721 |
1722 | str = "a b .c"
1723 | res = str.ops.splitPreserveAllTokens.get
1724 | assert(3 == res.length)
1725 | assert("a" == res(0))
1726 | assert("b" == res(1))
1727 | assert(".c" == res(2))
1728 |
1729 | str = " a b .c"
1730 | res = str.ops.splitPreserveAllTokens.get
1731 | assert(4 == res.length)
1732 | assert("" == res(0))
1733 | assert("a" == res(1))
1734 | assert("b" == res(2))
1735 | assert(".c" == res(3))
1736 |
1737 | str = "a b .c"
1738 | res = str.ops.splitPreserveAllTokens.get
1739 | assert(5 == res.length)
1740 | assert("a" == res(0))
1741 | assert("" == res(1))
1742 | assert("b" == res(2))
1743 | assert("" == res(3))
1744 | assert(".c" == res(4))
1745 |
1746 | str = " a "
1747 | res = str.ops.splitPreserveAllTokens.get
1748 | assert(4 == res.length)
1749 | assert("" == res(0))
1750 | assert("a" == res(1))
1751 | assert("" == res(2))
1752 | assert("" == res(3))
1753 |
1754 | str = " a b"
1755 | res = str.ops.splitPreserveAllTokens.get
1756 | assert(4 == res.length)
1757 | assert("" == res(0))
1758 | assert("a" == res(1))
1759 | assert("" == res(2))
1760 | assert("b" == res(3))
1761 |
1762 | str = "a" + WHITESPACE + "b" + NON_WHITESPACE + "c"
1763 | res = str.ops.splitPreserveAllTokens.get
1764 | assert(WHITESPACE.length + 1 == res.length)
1765 | assert("a" == res(0))
1766 | for (i <- 1 until WHITESPACE.length - 1) {
1767 | assert("" == res(i))
1768 | }
1769 | assert("b" + NON_WHITESPACE + "c" == res(WHITESPACE.length))
1770 | }
1771 |
1772 | test("test string split preserve all tokens by separator char") {
1773 | assert(noneString.ops.splitPreserveAllTokens('.').isEmpty)
1774 | assert("".ops.splitPreserveAllTokens('.').exists(_.length == 0))
1775 |
1776 | var str = "a.b. c"
1777 | var res = Some(str).ops.splitPreserveAllTokens('.').get
1778 | assert(3 == res.length)
1779 | assert("a" == res(0))
1780 | assert("b" == res(1))
1781 | assert(" c" == res(2))
1782 |
1783 | str = "a.b.. c"
1784 | res = str.ops.splitPreserveAllTokens('.').get
1785 | assert(4 == res.length)
1786 | assert("a" == res(0))
1787 | assert("b" == res(1))
1788 | assert("" == res(2))
1789 | assert(" c" == res(3))
1790 |
1791 | str = ".a."
1792 | res = str.ops.splitPreserveAllTokens('.').get
1793 | assert(3 == res.length)
1794 | assert("" == res(0))
1795 | assert("a" == res(1))
1796 | assert("" == res(2))
1797 |
1798 | str = ".a.."
1799 | res = str.ops.splitPreserveAllTokens('.').get
1800 | assert(4 == res.length)
1801 | assert("" == res(0))
1802 | assert("a" == res(1))
1803 | assert("" == res(2))
1804 | assert("" == res(3))
1805 |
1806 | str = "..a."
1807 | res = str.ops.splitPreserveAllTokens('.').get
1808 | assert(4 == res.length)
1809 | assert("" == res(0))
1810 | assert("" == res(1))
1811 | assert("a" == res(2))
1812 | assert("" == res(3))
1813 |
1814 | str = "..a"
1815 | res = str.ops.splitPreserveAllTokens('.').get
1816 | assert(3 == res.length)
1817 | assert("" == res(0))
1818 | assert("" == res(1))
1819 | assert("a" == res(2))
1820 |
1821 | str = "a b c"
1822 | res = Some(str).ops.splitPreserveAllTokens(' ').get
1823 | assert(3 == res.length)
1824 | assert("a" == res(0))
1825 | assert("b" == res(1))
1826 | assert("c" == res(2))
1827 |
1828 | str = "a b c"
1829 | res = str.ops.splitPreserveAllTokens(' ').get
1830 | assert(5 == res.length)
1831 | assert("a" == res(0))
1832 | assert("" == res(1))
1833 | assert("b" == res(2))
1834 | assert("" == res(3))
1835 | assert("c" == res(4))
1836 |
1837 | str = " a b c"
1838 | res = str.ops.splitPreserveAllTokens(' ').get
1839 | assert(4 == res.length)
1840 | assert("" == res(0))
1841 | assert("a" == res(1))
1842 | assert("b" == res(2))
1843 | assert("c" == res(3))
1844 |
1845 | str = " a b c"
1846 | res = str.ops.splitPreserveAllTokens(' ').get
1847 | assert(5 == res.length)
1848 | assert("" == res(0))
1849 | assert("" == res(1))
1850 | assert("a" == res(2))
1851 | assert("b" == res(3))
1852 | assert("c" == res(4))
1853 |
1854 | str = "a b c "
1855 | res = Some(str).ops.splitPreserveAllTokens(' ').get
1856 | assert(4 == res.length)
1857 | assert("a" == res(0))
1858 | assert("b" == res(1))
1859 | assert("c" == res(2))
1860 | assert("" == res(3))
1861 |
1862 | str = "a b c "
1863 | res = str.ops.splitPreserveAllTokens(' ').get
1864 | assert(5 == res.length)
1865 | assert("a" == res(0))
1866 | assert("b" == res(1))
1867 | assert("c" == res(2))
1868 | assert("" == res(3))
1869 | assert("" == res(3))
1870 |
1871 | // Match example in javadoc
1872 | val expectedResults = Array("a", "", "b", "c")
1873 | val results = "a..b.c".ops.splitPreserveAllTokens('.').get
1874 | assert(expectedResults.length == results.length)
1875 | for (i <- expectedResults.indices) {
1876 | assert(expectedResults(i) == results(i))
1877 | }
1878 |
1879 | }
1880 |
1881 | test("test string split preserve all tokens with separator char and max times") {
1882 | assert(noneString.ops.splitPreserveAllTokens(".").isEmpty)
1883 | assert(nullString.ops.splitPreserveAllTokens(".", 3).isEmpty)
1884 |
1885 | assert("".ops.splitPreserveAllTokens(Some(".")).exists(_.length == 0))
1886 | assert(Some("").ops.splitPreserveAllTokens(".", 3).exists(_.length == 0))
1887 |
1888 | innerTestSplitPreserveAllTokens('.', ".", ' ')
1889 | innerTestSplitPreserveAllTokens('.', ".", ',')
1890 | innerTestSplitPreserveAllTokens('.', ".,", 'x')
1891 | for (i <- 0 until WHITESPACE.length) {
1892 | for (j <- 0 until NON_WHITESPACE.length) {
1893 | innerTestSplitPreserveAllTokens(WHITESPACE.charAt(i), null, NON_WHITESPACE.charAt(j))
1894 | innerTestSplitPreserveAllTokens(WHITESPACE.charAt(i), String.valueOf(WHITESPACE.charAt(i)), NON_WHITESPACE.charAt(j))
1895 | }
1896 | }
1897 |
1898 | var expectedResults: Array[String] = Array("ab", "de fg")
1899 | var results: Array[String] = "ab de fg".ops.splitPreserveAllTokens(nullString, 2).get
1900 | assert(expectedResults.length == results.length)
1901 | for (i <- expectedResults.indices) {
1902 | assert(expectedResults(i) == results(i))
1903 | }
1904 |
1905 | expectedResults = Array("ab", " de fg")
1906 | results = "ab de fg".ops.splitPreserveAllTokens(noneString, 2).get
1907 | assert(expectedResults.length == results.length)
1908 | for (i <- expectedResults.indices) {
1909 | assert(expectedResults(i) == results(i))
1910 | }
1911 |
1912 | expectedResults = Array("ab", "::de:fg")
1913 | results = "ab:::de:fg".ops.splitPreserveAllTokens(":", 2).get
1914 | assert(expectedResults.length == results.length)
1915 | for (i <- expectedResults.indices) {
1916 | assert(expectedResults(i) == results(i))
1917 | }
1918 |
1919 | expectedResults = Array("ab", "", " de fg")
1920 | results = Some("ab de fg").ops.splitPreserveAllTokens(nullString, 3).get
1921 | assert(expectedResults.length == results.length)
1922 | for (i <- expectedResults.indices) {
1923 | assert(expectedResults(i) == results(i))
1924 | }
1925 |
1926 | expectedResults = Array("ab", "", "", "de fg")
1927 | results = "ab de fg".ops.splitPreserveAllTokens(noneString, 4).get
1928 | assert(expectedResults.length == results.length)
1929 | for (i <- expectedResults.indices) {
1930 | assert(expectedResults(i) == results(i))
1931 | }
1932 |
1933 | expectedResults = Array("ab", "cd:ef")
1934 | results = "ab:cd:ef".ops.splitPreserveAllTokens(Some(":"), 2).get
1935 | assert(expectedResults.length == results.length)
1936 | for (i <- expectedResults.indices) {
1937 | assert(expectedResults(i) == results(i))
1938 | }
1939 |
1940 | expectedResults = Array("ab", ":cd:ef")
1941 | results = "ab::cd:ef".ops.splitPreserveAllTokens(":", 2).get
1942 | assert(expectedResults.length == results.length)
1943 | for (i <- expectedResults.indices) {
1944 | assert(expectedResults(i) == results(i))
1945 | }
1946 |
1947 | expectedResults = Array("ab", "", ":cd:ef")
1948 | results = "ab:::cd:ef".ops.splitPreserveAllTokens(":", 3).get
1949 | assert(expectedResults.length == results.length)
1950 | for (i <- expectedResults.indices) {
1951 | assert(expectedResults(i) == results(i))
1952 | }
1953 |
1954 | expectedResults = Array("ab", "", "", "cd:ef")
1955 | results = Some("ab:::cd:ef").ops.splitPreserveAllTokens(Some(":"), 4).get
1956 | assert(expectedResults.length == results.length)
1957 | for (i <- expectedResults.indices) {
1958 | assert(expectedResults(i) == results(i))
1959 | }
1960 |
1961 | expectedResults = Array("", "ab", "", "", "cd:ef")
1962 | results = ":ab:::cd:ef".ops.splitPreserveAllTokens(":", 5).get
1963 | assert(expectedResults.length == results.length)
1964 | for (i <- expectedResults.indices) {
1965 | assert(expectedResults(i) == results(i))
1966 | }
1967 |
1968 | expectedResults = Array("", "", "ab", "", "", "cd:ef")
1969 | results = "::ab:::cd:ef".ops.splitPreserveAllTokens(":", 6).get
1970 | assert(expectedResults.length == results.length)
1971 | for (i <- expectedResults.indices) {
1972 | assert(expectedResults(i) == results(i))
1973 | }
1974 |
1975 | }
1976 |
1977 | test("test string swap case") {
1978 | assert(nullString.ops.swapCase.isEmpty)
1979 | assert(Some("").ops.swapCase.contains(""))
1980 | assert(" ".ops.swapCase.contains(" "))
1981 |
1982 | assert(Some("I").ops.swapCase.contains("i"))
1983 | assert("i".ops.swapCase.contains("I"))
1984 | assert("i am here 123".ops.swapCase.contains("I AM HERE 123"))
1985 | assert("I Am Here 123".ops.swapCase.contains("i aM hERE 123"))
1986 | assert("i am HERE 123".ops.swapCase.contains("I AM here 123"))
1987 | assert(Some("I AM HERE 123").ops.swapCase.contains("i am here 123"))
1988 |
1989 | val test = "This String contains a TitleCase character: \u01C8"
1990 | val expect = "tHIS sTRING CONTAINS A tITLEcASE CHARACTER: \u01C9"
1991 | assert(test.ops.swapCase.contains(expect))
1992 | }
1993 |
1994 | test("test string to code points") {
1995 | val orphanedHighSurrogate = 0xd801
1996 | val orphanedLowSurrogate = 0xdc00
1997 | val supplementary = 0x2070e
1998 |
1999 | val codePoints: Array[Int] = Array('a', orphanedHighSurrogate, 'b', 'c', supplementary, 'd', orphanedLowSurrogate, 'e')
2000 | val s = new String(codePoints, 0, codePoints.length)
2001 | assert(Some(s).ops.toCodePoints.exists(e => Objects.deepEquals(e, codePoints)))
2002 |
2003 | assert(noneString.ops.toCodePoints.isEmpty)
2004 | assert("".ops.toCodePoints.exists(e => Objects.deepEquals(e, ArrayUtils.EMPTY_INT_ARRAY)))
2005 | }
2006 |
2007 | test("test string truncate with max width") {
2008 | assert(noneString.ops.truncate(12).isEmpty)
2009 | assertThrows[IllegalArgumentException] {
2010 | nullString.ops.truncate(-1)
2011 | }
2012 | assertThrows[IllegalArgumentException] {
2013 | noneString.ops.truncate(-10)
2014 | }
2015 | assertThrows[IllegalArgumentException] {
2016 | noneString.ops.truncate(Integer.MIN_VALUE)
2017 | }
2018 |
2019 | assert("".ops.truncate(10).contains(""))
2020 | assert("".ops.truncate(10).contains(""))
2021 | assert(Some("abcdefghij").ops.truncate(3).contains("abc"))
2022 | assert("abcdefghij".ops.truncate(6).contains("abcdef"))
2023 | assert("abcdefghij".ops.truncate(0).contains(""))
2024 | assertThrows[IllegalArgumentException] {
2025 | "abcdefghij".ops.truncate(-1)
2026 | }
2027 | assertThrows[IllegalArgumentException] {
2028 | "abcdefghij".ops.truncate(-100)
2029 | }
2030 | assertThrows[IllegalArgumentException] {
2031 | Some("abcdefghij").ops.truncate(Integer.MIN_VALUE)
2032 | }
2033 | assert("abcdefghijklmno".ops.truncate(10).contains("abcdefghij"))
2034 | assert("abcdefghijklmno".ops.truncate(Integer.MAX_VALUE).contains("abcdefghijklmno"))
2035 | assert("abcdefghijklmno".ops.truncate(5).contains("abcde"))
2036 | assert("abcdefghijklmno".ops.truncate(3).contains("abc"))
2037 | }
2038 |
2039 | test("test string truncate with offset and max width") {
2040 | assert(nullString.ops.truncate(0, 12).isEmpty)
2041 | assertThrows[IllegalArgumentException] {
2042 | nullString.ops.truncate(-1, 0)
2043 | }
2044 | assertThrows[IllegalArgumentException] {
2045 | noneString.ops.truncate(-10, -4)
2046 | }
2047 | assertThrows[IllegalArgumentException] {
2048 | noneString.ops.truncate(Integer.MIN_VALUE, Integer.MIN_VALUE)
2049 | }
2050 | assert(nullString.ops.truncate(10, 12).isEmpty)
2051 | assert("".ops.truncate(0, 10).contains(""))
2052 | assert("".ops.truncate(2, 10).contains(""))
2053 | assert(Some("abcdefghij").ops.truncate(0, 3).contains("abc"))
2054 | assert("abcdefghij".ops.truncate(5, 6).contains("fghij"))
2055 | assert("abcdefghij".ops.truncate(0, 0).contains(""))
2056 | assertThrows[IllegalArgumentException] {
2057 | "abcdefghij".ops.truncate(0, -1)
2058 | }
2059 | assertThrows[IllegalArgumentException] {
2060 | "abcdefghij".ops.truncate(0, -10)
2061 | }
2062 | assertThrows[IllegalArgumentException] {
2063 | "abcdefghij".ops.truncate(0, -100)
2064 | }
2065 | assertThrows[IllegalArgumentException] {
2066 | Some("abcdefghij").ops.truncate(1, -100)
2067 | }
2068 | assertThrows[IllegalArgumentException] {
2069 | "abcdefghij".ops.truncate(0, Integer.MIN_VALUE)
2070 | }
2071 | assertThrows[IllegalArgumentException] {
2072 | "abcdefghij".ops.truncate(-1, 0)
2073 | }
2074 | assertThrows[IllegalArgumentException] {
2075 | "abcdefghij".ops.truncate(-10, 0)
2076 | }
2077 | assertThrows[IllegalArgumentException] {
2078 | "abcdefghij".ops.truncate(-100, 1)
2079 | }
2080 | assertThrows[IllegalArgumentException] {
2081 | "abcdefghij".ops.truncate(Integer.MIN_VALUE, 0)
2082 | }
2083 | assertThrows[IllegalArgumentException] {
2084 | "abcdefghij".ops.truncate(-1, -1)
2085 | }
2086 | assertThrows[IllegalArgumentException] {
2087 | "abcdefghij".ops.truncate(-10, -10)
2088 | }
2089 | assertThrows[IllegalArgumentException] {
2090 | "abcdefghij".ops.truncate(-100, -100)
2091 | }
2092 | assertThrows[IllegalArgumentException] {
2093 | "abcdefghij".ops.truncate(Integer.MIN_VALUE, Integer.MIN_VALUE)
2094 | }
2095 | val raspberry = "raspberry peach"
2096 | assert(raspberry.ops.truncate(10, 15).contains("peach"))
2097 | assert(Some("abcdefghijklmno").ops.truncate(0, 10).contains("abcdefghij"))
2098 | assert("abcdefghijklmno".ops.truncate(0, Integer.MAX_VALUE).contains("abcdefghijklmno"))
2099 | assert("abcdefghijklmno".ops.truncate(1, 10).contains("bcdefghijk"))
2100 | assert(Some("abcdefghijklmno").ops.truncate(2, 10).contains("cdefghijkl"))
2101 | assert("abcdefghijklmno".ops.truncate(3, 10).contains("defghijklm"))
2102 | assert("abcdefghijklmno".ops.truncate(4, 10).contains("efghijklmn"))
2103 | assert("abcdefghijklmno".ops.truncate(5, 10).contains("fghijklmno"))
2104 | assert("abcdefghijklmno".ops.truncate(5, 5).contains("fghij"))
2105 | assert("abcdefghijklmno".ops.truncate(5, 3).contains("fgh"))
2106 | assert("abcdefghijklmno".ops.truncate(10, 3).contains("klm"))
2107 | assert("abcdefghijklmno".ops.truncate(10, Integer.MAX_VALUE).contains("klmno"))
2108 | assert("abcdefghijklmno".ops.truncate(13, 1).contains("n"))
2109 | assert("abcdefghijklmno".ops.truncate(13, Integer.MAX_VALUE).contains("no"))
2110 | assert("abcdefghijklmno".ops.truncate(14, 1).contains("o"))
2111 | assert("abcdefghijklmno".ops.truncate(14, Integer.MAX_VALUE).contains("o"))
2112 | assert("abcdefghijklmno".ops.truncate(15, 1).contains(""))
2113 | assert("abcdefghijklmno".ops.truncate(15, Integer.MAX_VALUE).contains(""))
2114 | assert("abcdefghijklmno".ops.truncate(Integer.MAX_VALUE, Integer.MAX_VALUE).contains(""))
2115 | }
2116 |
2117 | test("test string uncapitalize") {
2118 | assert(noneString.ops.uncapitalize.isEmpty)
2119 |
2120 | assert(FOO_CAP.ops.uncapitalize.contains(FOO_UNCAP), "uncapitalize(String) failed")
2121 | assert(FOO_UNCAP.ops.uncapitalize.contains(FOO_UNCAP), "uncapitalize(string) failed")
2122 | assert("".ops.uncapitalize.contains(""), "uncapitalize(empty-string) failed")
2123 | assert(Some("X").ops.uncapitalize.contains("x"), "uncapitalize(single-char-string) failed")
2124 |
2125 | // Examples from uncapitalize Javadoc
2126 | assert("cat".ops.uncapitalize.contains("cat"))
2127 | assert("Cat".ops.uncapitalize.contains("cat"))
2128 | assert("CAT".ops.uncapitalize.contains("cAT"))
2129 | }
2130 |
2131 | test("test string unwrap with wrap token") {
2132 | assert(noneString.ops.unwrap(nullString).isEmpty)
2133 | assert(nullString.ops.unwrap(CharUtils.NUL).isEmpty)
2134 | assert(nullString.ops.unwrap('1').isEmpty)
2135 |
2136 | assert(Some("abc").ops.unwrap(noneString).contains("abc"))
2137 | assert("a".ops.unwrap(Some("a")).contains("a"))
2138 | assert("aa".ops.unwrap("a").contains(""))
2139 | assert("\'abc\'".ops.unwrap('\'').contains("abc"))
2140 | assert(Some("AabcA").ops.unwrap('A').contains("abc"))
2141 | assert("AAabcAA".ops.unwrap('A').contains("AabcA"))
2142 | assert("abc".ops.unwrap('b').contains("abc"))
2143 | assert("#A".ops.unwrap('#').contains("#A"))
2144 | assert("A#".ops.unwrap('#').contains("A#"))
2145 | assert("AABAA".ops.unwrap('A').contains("ABA"))
2146 | }
2147 |
2148 | test("test string unwrap with wrap token string") {
2149 | assert(nullString.ops.unwrap(noneString).isEmpty)
2150 | assert(noneString.ops.unwrap("").isEmpty)
2151 | assert(nullString.ops.unwrap(Some("1")).isEmpty)
2152 |
2153 | assert("abc".ops.unwrap(nullString).contains("abc"))
2154 | assert("abc".ops.unwrap("").contains("abc"))
2155 | assert(Some("a").ops.unwrap("a").contains("a"))
2156 | assert("ababa".ops.unwrap(Some("aba")).contains("ababa"))
2157 | assert("aa".ops.unwrap("a").contains(""))
2158 | assert("\'abc\'".ops.unwrap("\'").contains("abc"))
2159 | assert("\"abc\"".ops.unwrap("\"").contains("abc"))
2160 | assert(Some("\"abc\"xyz\"").ops.unwrap("\"").contains("abc\"xyz"))
2161 | assert("\"abc\"xyz\"\"".ops.unwrap("\"").contains("abc\"xyz\""))
2162 | assert("\"abc\'xyz\'\"".ops.unwrap("\"").contains("abc\'xyz\'"))
2163 | assert("AA\"abc\'xyz\'\"AA".ops.unwrap("AA").contains("\"abc\'xyz\'\""))
2164 | assert("123\"abc\'xyz\'\"123".ops.unwrap("123").contains("\"abc\'xyz\'\""))
2165 | assert("AA\"abc\'xyz\'\"".ops.unwrap("AA").contains("AA\"abc\'xyz\'\""))
2166 | assert("AAA\"abc\'xyz\'\"AAA".ops.unwrap("A").contains("AA\"abc\'xyz\'\"AA"))
2167 | assert("\"abc\'xyz\'\"AA".ops.unwrap("AA").contains("\"abc\'xyz\'\"AA"))
2168 | }
2169 |
2170 | test("test string upper case") {
2171 | assert(nullString.ops.upperCase.isEmpty)
2172 | assert(noneString.ops.upperCase(Locale.ENGLISH).isEmpty)
2173 | assert(Some("fOo test THING").ops.upperCase.contains("FOO TEST THING"), "upperCase(String) failed")
2174 | assert("".ops.upperCase.contains(""), "upperCase(empty-string) failed")
2175 | assert("fOo test THING".ops.upperCase(Locale.ENGLISH).contains("FOO TEST THING"), "upperCase(String, Locale) failed")
2176 | assert("".ops.upperCase(Locale.ENGLISH).contains(""), "upperCase(empty-string, Locale) failed")
2177 | }
2178 |
2179 | test("test string wrap with char") {
2180 | assert(nullString.ops.wrap(CharUtils.NUL).isEmpty)
2181 | assert(noneString.ops.wrap('1').isEmpty)
2182 |
2183 | assert("".ops.wrap(CharUtils.NUL).contains(""))
2184 | assert("ab".ops.wrap('x').contains("xabx"))
2185 | assert(Some("ab").ops.wrap('\"').contains("\"ab\""))
2186 | assert("\"ab\"".ops.wrap('\"').contains("\"\"ab\"\""))
2187 | assert("ab".ops.wrap('\'').contains("'ab'"))
2188 | assert("'abcd'".ops.wrap('\'').contains("''abcd''"))
2189 | assert("\"abcd\"".ops.wrap('\'').contains("'\"abcd\"'"))
2190 | assert("'abcd'".ops.wrap('\"').contains("\"'abcd'\""))
2191 | }
2192 |
2193 | test("test string wrap with string") {
2194 | assert(noneString.ops.wrap(nullString).isEmpty)
2195 | assert(nullString.ops.wrap("").isEmpty)
2196 | assert(noneString.ops.wrap("1").isEmpty)
2197 |
2198 | assert(nullString.ops.wrap(noneString).isEmpty)
2199 | assert(Some("").ops.wrap("").contains(""))
2200 | assert("ab".ops.wrap(nullString).contains("ab"))
2201 | assert(Some("ab").ops.wrap(Some("x")).contains("xabx"))
2202 | assert("ab".ops.wrap("\"").contains("\"ab\""))
2203 | assert("\"ab\"".ops.wrap("\"").contains("\"\"ab\"\""))
2204 | assert("ab".ops.wrap(Some("'")).contains("'ab'"))
2205 | assert("'abcd'".ops.wrap("'").contains("''abcd''"))
2206 | assert("\"abcd\"".ops.wrap("'").contains("'\"abcd\"'"))
2207 | assert("'abcd'".ops.wrap("\"").contains("\"'abcd'\""))
2208 | }
2209 |
2210 | test("test string wrap if missing char") {
2211 | assert(noneString.ops.wrapIfMissing(CharUtils.NUL).isEmpty)
2212 | assert(nullString.ops.wrapIfMissing('1').isEmpty)
2213 |
2214 | assert(Some("").ops.wrapIfMissing(CharUtils.NUL).contains(""))
2215 | assert("ab".ops.wrapIfMissing('x').contains("xabx"))
2216 | assert("ab".ops.wrapIfMissing('\"').contains("\"ab\""))
2217 | assert("\"ab\"".ops.wrapIfMissing('\"').contains("\"ab\""))
2218 | assert("ab".ops.wrapIfMissing('\'').contains("'ab'"))
2219 | assert("'abcd'".ops.wrapIfMissing('\'').contains("'abcd'"))
2220 | assert("\"abcd\"".ops.wrapIfMissing('\'').contains("'\"abcd\"'"))
2221 | assert(Some("'abcd'").ops.wrapIfMissing('\"').contains("\"'abcd'\""))
2222 | assert("x".ops.wrapIfMissing('/').contains("/x/"))
2223 | assert("x/y/z".ops.wrapIfMissing('/').contains("/x/y/z/"))
2224 | assert("/x/y/z".ops.wrapIfMissing('/').contains("/x/y/z/"))
2225 | assert("x/y/z/".ops.wrapIfMissing('/').contains("/x/y/z/"))
2226 |
2227 | assert("/".ops.wrapIfMissing('/').contains("/"))
2228 | assert("/x/".ops.wrapIfMissing('/').contains("/x/"))
2229 | }
2230 |
2231 | test("test string wrap if missing string") {
2232 | assert(nullString.ops.wrapIfMissing(Some("\u0000")).isEmpty)
2233 | assert(noneString.ops.wrapIfMissing("1").isEmpty)
2234 |
2235 | assert(Some("").ops.wrapIfMissing("\u0000").contains(""))
2236 | assert(Some("ab").ops.wrapIfMissing(Some("x")).contains("xabx"))
2237 | assert("ab".ops.wrapIfMissing("\"").contains("\"ab\""))
2238 | assert("\"ab\"".ops.wrapIfMissing("\"").contains("\"ab\""))
2239 | assert("ab".ops.wrapIfMissing("\'").contains("'ab'"))
2240 | assert("'abcd'".ops.wrapIfMissing("\'").contains("'abcd'"))
2241 | assert("\"abcd\"".ops.wrapIfMissing("\'").contains("'\"abcd\"'"))
2242 | assert(Some("'abcd'").ops.wrapIfMissing("\"").contains("\"'abcd'\""))
2243 | assert("x".ops.wrapIfMissing("/").contains("/x/"))
2244 | assert("x/y/z".ops.wrapIfMissing("/").contains("/x/y/z/"))
2245 | assert("/x/y/z".ops.wrapIfMissing("/").contains("/x/y/z/"))
2246 | assert("x/y/z/".ops.wrapIfMissing(Some("/")).contains("/x/y/z/"))
2247 | assert("/".ops.wrapIfMissing("/").contains("/"))
2248 | assert("/".ops.wrapIfMissing("ab").contains("ab/ab"))
2249 |
2250 | assert("ab/ab".ops.wrapIfMissing("ab").contains("ab/ab"))
2251 | assert("//x//".ops.wrapIfMissing("//").contains("//x//"))
2252 | }
2253 |
2254 | test("test string to root lower case") {
2255 | assert(noneString.ops.toRootLowerCase.isEmpty)
2256 | assert(Some("A").ops.toRootLowerCase.contains("a"))
2257 | assert(Some("a").ops.toRootLowerCase.contains("a"))
2258 | val TURKISH = Locale.forLanguageTag("tr")
2259 | // Sanity checks:
2260 | assert("TITLE".toLowerCase(TURKISH) != "title")
2261 | assert("TITLE".toLowerCase(Locale.ROOT) == "title")
2262 | assert("TITLE".ops.toRootLowerCase.contains("title"))
2263 | // Make sure we are not using the default Locale:
2264 | val defaultLocale = Locale.getDefault
2265 | try {
2266 | Locale.setDefault(TURKISH)
2267 | assert("TITLE".ops.toRootLowerCase.contains("title"))
2268 | } finally Locale.setDefault(defaultLocale)
2269 | }
2270 |
2271 | test("test string to root upper case") {
2272 | assert(noneString.ops.toRootUpperCase.isEmpty)
2273 | assert(Some("a").ops.toRootUpperCase.contains("A"))
2274 | assert("A".ops.toRootUpperCase.contains("A"))
2275 | val TURKISH = Locale.forLanguageTag("tr")
2276 | // Sanity checks:
2277 | assert("TITLE" != "title".toUpperCase(TURKISH))
2278 | assert("TITLE" == "title".toUpperCase(Locale.ROOT))
2279 | assert(Some("title").ops.toRootUpperCase.contains("TITLE"))
2280 | // Make sure we are not using the default Locale:
2281 | val defaultLocale = Locale.getDefault();
2282 | try {
2283 | Locale.setDefault(TURKISH)
2284 | assert("title".ops.toRootUpperCase.contains("TITLE"));
2285 | } finally {
2286 | Locale.setDefault(defaultLocale);
2287 | }
2288 | }
2289 |
2290 | test("test string georgian") {
2291 | val arrayI = Array[Char]( // Latin Small Letter dotless I
2292 | 0x0131.toChar, // Greek Capital Letter Theta
2293 | 0x03f4.toChar
2294 | )
2295 | val arrayJ = Array[Char]( // Latin Capital Letter I with dot above
2296 | 0x0130.toChar, // Greek Theta Symbol
2297 | 0x03d1.toChar
2298 | )
2299 | for (i <- arrayI) {
2300 | for (j <- arrayJ) {
2301 | val si = String.valueOf(i)
2302 | val sj = String.valueOf(j)
2303 | val res1 = si.equalsIgnoreCase(sj)
2304 | val ci = new mutable.StringBuilder(si)
2305 | val cj = new mutable.StringBuilder(sj)
2306 | var res2 = ci.toString().ops.startsWithIgnoreCase(cj.toString())
2307 | assert(res1 == res2, "si : " + si + " sj : " + sj)
2308 | res2 = ci.toString().ops.endsWithIgnoreCase(cj.toString())
2309 | assert(res1 == res2, "si : " + si + " sj : " + sj)
2310 | res2 = ci.toString.ops.compareIgnoreCase(cj.toString) == 0
2311 | assert(res1 == res2, "si : " + si + " sj : " + sj)
2312 | res2 = ci.toString.ops.indexOfIgnoreCase(cj.toString) == 0
2313 | assert(res1 == res2, "si : " + si + " sj : " + sj)
2314 | res2 = ci.toString.ops.indexOfIgnoreCase(cj.toString) == 0
2315 | assert(res1 == res2, "si : " + si + " sj : " + sj)
2316 | }
2317 | }
2318 | }
2319 | }
2320 |
2321 | object StringUtilsSpec {
2322 | val (whitespace: String, non_whitespace: String, hard_space: String, trimmable: String, non_trimmable: String) = {
2323 | val ws: mutable.StringBuilder = new mutable.StringBuilder
2324 | val nws: mutable.StringBuilder = new mutable.StringBuilder
2325 | val hs: String = String.valueOf(160.toChar)
2326 | val tr: mutable.StringBuilder = new mutable.StringBuilder
2327 | val ntr: mutable.StringBuilder = new mutable.StringBuilder
2328 |
2329 | for (i <- 0 until Character.MAX_VALUE) {
2330 | if (Character.isWhitespace(i.toChar)) {
2331 | ws.append(String.valueOf(i.toChar))
2332 | if (i > 32) ntr.append(String.valueOf(i.toChar))
2333 | } else if (i < 40) nws.append(String.valueOf(i.toChar))
2334 | }
2335 | for (i <- 0 to 32) {
2336 | tr.append(String.valueOf(i.toChar))
2337 | }
2338 | (ws.toString, nws.toString, hs, tr.toString, ntr.toString)
2339 | }
2340 | val WHITESPACE: String = whitespace
2341 | val NON_WHITESPACE: String = non_whitespace
2342 | val HARD_SPACE: String = hard_space
2343 | val TRIMMABLE: String = trimmable
2344 | val NON_TRIMMABLE: String = non_trimmable
2345 |
2346 | val ARRAY_LIST: Array[String] = Array("foo", "bar", "baz")
2347 | val EMPTY_ARRAY_LIST: Array[String] = Array()
2348 | val NULL_ARRAY_LIST: Array[String] = Array(null)
2349 | val NULL_TO_STRING_LIST: Array[Object] = Array(new Object() {
2350 | override def toString: String = null
2351 | })
2352 | val MIXED_ARRAY_LIST: Array[String] = Array(null, "", "foo")
2353 | val MIXED_TYPE_LIST: Array[Any] = Array("foo", 2L)
2354 | val LONG_PRIM_LIST: Array[Long] = Array(1, 2)
2355 | val INT_PRIM_LIST: Array[Int] = Array(1, 2)
2356 | val BYTE_PRIM_LIST: Array[Byte] = Array(1, 2)
2357 | val SHORT_PRIM_LIST: Array[Short] = Array(1, 2)
2358 | val CHAR_PRIM_LIST: Array[Char] = Array('1', '2')
2359 | val FLOAT_PRIM_LIST: Array[Float] = Array(1, 2)
2360 | val DOUBLE_PRIM_LIST: Array[Double] = Array(1, 2)
2361 | val MIXED_STRING_LIST: util.List[String] = util.Arrays.asList(null, "", "foo")
2362 | val MIXED_TYPE_OBJECT_LIST: util.List[Any] = util.Arrays.asList[Any]("foo", 2L)
2363 | val STRING_LIST: util.List[String] = util.Arrays.asList("foo", "bar", "baz")
2364 | val EMPTY_STRING_LIST: List[String] = List.empty
2365 | val NULL_STRING_LIST: util.List[String] = Collections.singletonList(null)
2366 |
2367 | val SEPARATOR: String = ","
2368 | val SEPARATOR_CHAR: Char = ';'
2369 | val COMMA_SEPARATOR_CHAR: Char = ','
2370 |
2371 | val TEXT_LIST: String = "foo,bar,baz"
2372 | val TEXT_LIST_CHAR: String = "foo;bar;baz"
2373 | val TEXT_LIST_NOSEP: String = "foobarbaz"
2374 |
2375 | val FOO_UNCAP: String = "foo"
2376 | val FOO_CAP: String = "Foo"
2377 |
2378 | val SENTENCE_UNCAP: String = "foo bar baz"
2379 | val SENTENCE_CAP: String = "Foo Bar Baz"
2380 |
2381 | val EMPTY: Array[Boolean] = Array()
2382 | val ARRAY_FALSE_FALSE: Array[Boolean] = Array(false, false)
2383 | val ARRAY_FALSE_TRUE: Array[Boolean] = Array(false, true)
2384 | val ARRAY_FALSE_TRUE_FALSE: Array[Boolean] = Array(false, true, false)
2385 |
2386 | val noneString: Option[String] = None
2387 | val nullString: String = null
2388 | val noneStrings: Option[Array[String]] = None
2389 | }
2390 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsStartsEndsWithSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops.StringOptExt
4 | import org.scalatest.funsuite.AnyFunSuite
5 |
6 | import scala.collection.mutable
7 |
8 | /** TODO
9 | *
10 | * @author
11 | * mars
12 | * @version 1.0.0
13 | * @since 2022/09/11
14 | * 17:08
15 | */
16 | class StringUtilsStartsEndsWithSpec extends AnyFunSuite {
17 | private val foo = "foo"
18 | private val bar = "bar"
19 | private val foobar = "foobar"
20 | private val FOO = "FOO"
21 | private val BAR = "BAR"
22 | private val FOOBAR = "FOOBAR"
23 |
24 | import StringUtilsSpec.{noneString, nullString}
25 |
26 | test("test string starts with") {
27 | assert(nullString.ops.startsWith(nullString), "startsWith(null, null)")
28 | assert(!FOOBAR.ops.startsWith(noneString), "startsWith(FOOBAR, null)")
29 | assert(!nullString.ops.startsWith(FOO), "startsWith(null, FOO)")
30 | assert(FOOBAR.ops.startsWith(""), "startsWith(FOOBAR, \"\")")
31 |
32 | assert(foobar.ops.startsWith(foo), "startsWith(foobar, foo)")
33 | assert(FOOBAR.ops.startsWith(FOO), "startsWith(FOOBAR, FOO)")
34 | assert(!foobar.ops.startsWith(FOO), "startsWith(foobar, FOO)")
35 | assert(!FOOBAR.ops.startsWith(foo), "startsWith(FOOBAR, foo)")
36 |
37 | assert(!foo.ops.startsWith(foobar), "startsWith(foo, foobar)")
38 | assert(!bar.ops.startsWith(foobar), "startsWith(foo, foobar)")
39 |
40 | assert(!foobar.ops.startsWith(bar), "startsWith(foobar, bar)")
41 | assert(!FOOBAR.ops.startsWith(BAR), "startsWith(FOOBAR, BAR)")
42 | assert(!foobar.ops.startsWith(BAR), "startsWith(foobar, BAR)")
43 | assert(!FOOBAR.ops.startsWith(bar), "startsWith(FOOBAR, bar)")
44 | }
45 |
46 | test("test string starts with ignore case") {
47 | assert(noneString.ops.startsWithIgnoreCase(nullString), "startsWithIgnoreCase(null, null)")
48 | assert(!FOOBAR.ops.startsWithIgnoreCase(noneString), "startsWithIgnoreCase(FOOBAR, null)")
49 | assert(!nullString.ops.startsWithIgnoreCase(FOO), "startsWithIgnoreCase(null, FOO)")
50 | assert(FOOBAR.ops.startsWithIgnoreCase(""), "startsWithIgnoreCase(FOOBAR, \"\")")
51 |
52 | assert(foobar.ops.startsWithIgnoreCase(foo), "startsWithIgnoreCase(foobar, foo)")
53 | assert(FOOBAR.ops.startsWithIgnoreCase(FOO), "startsWithIgnoreCase(FOOBAR, FOO)")
54 | assert(foobar.ops.startsWithIgnoreCase(FOO), "startsWithIgnoreCase(foobar, FOO)")
55 | assert(FOOBAR.ops.startsWithIgnoreCase(foo), "startsWithIgnoreCase(FOOBAR, foo)")
56 |
57 | assert(!foo.ops.startsWithIgnoreCase(foobar), "startsWithIgnoreCase(foo, foobar)")
58 | assert(!bar.ops.startsWithIgnoreCase(foobar), "startsWithIgnoreCase(foo, foobar)")
59 |
60 | assert(!foobar.ops.startsWithIgnoreCase(bar), "startsWithIgnoreCase(foobar, bar)")
61 | assert(!FOOBAR.ops.startsWithIgnoreCase(BAR), "startsWithIgnoreCase(FOOBAR, BAR)")
62 | assert(!foobar.ops.startsWithIgnoreCase(BAR), "startsWithIgnoreCase(foobar, BAR)")
63 | assert(!FOOBAR.ops.startsWithIgnoreCase(bar), "startsWithIgnoreCase(FOOBAR, bar)")
64 | }
65 |
66 | test("test starts with any") {
67 | assert(!nullString.ops.startsWithAny(null.asInstanceOf[Array[String]]: _*))
68 | assert(!noneString.ops.startsWithAny("abc"))
69 | assert(!"abcxyz".ops.startsWithAny(null.asInstanceOf[Array[String]]: _*))
70 | assert(!"abcxyz".ops.startsWithAny[String]())
71 | assert("abcxyz".ops.startsWithAny("abc"))
72 | assert("abcxyz".ops.startsWithAny(null, "xyz", "abc"))
73 | assert(!Some("abcxyz").ops.startsWithAny(null, "xyz", "abcd"))
74 | assert(Some("abcxyz").ops.startsWithAny(Some("")))
75 | assert(!"abcxyz".ops.startsWithAny(null, "xyz", "ABCX"))
76 | assert(!"ABCXYZ".ops.startsWithAny(null, "xyz", "abc"))
77 |
78 | assert(
79 | "abcxyz".ops.startsWithAny(new mutable.StringBuilder("xyz"), new StringBuffer("abc")),
80 | "StringUtils.startsWithAny(abcxyz, StringBuilder(xyz), StringBuffer(abc))"
81 | )
82 |
83 | }
84 |
85 | test("test ends with") {
86 | assert(nullString.ops.endsWith(noneString), "endsWith(null, null)")
87 | assert(!FOOBAR.ops.endsWith(nullString), "endsWith(FOOBAR, null)")
88 | assert(!noneString.ops.endsWith(FOO), "endsWith(null, FOO)")
89 | assert(FOOBAR.ops.endsWith(""), "endsWith(FOOBAR, \"\")")
90 |
91 | assert(!foobar.ops.endsWith(foo), "endsWith(foobar, foo)")
92 | assert(!FOOBAR.ops.endsWith(FOO), "endsWith(FOOBAR, FOO)")
93 | assert(!foobar.ops.endsWith(FOO), "endsWith(foobar, FOO)")
94 | assert(!FOOBAR.ops.endsWith(foo), "endsWith(FOOBAR, foo)")
95 |
96 | assert(!foo.ops.endsWith(foobar), "endsWith(foo, foobar)")
97 | assert(!bar.ops.endsWith(foobar), "endsWith(foo, foobar)")
98 |
99 | assert(foobar.ops.endsWith(bar), "endsWith(foobar, bar)")
100 | assert(FOOBAR.ops.endsWith(BAR), "endsWith(FOOBAR, BAR)")
101 | assert(!foobar.ops.endsWith(BAR), "endsWith(foobar, BAR)")
102 | assert(!FOOBAR.ops.endsWith(bar), "endsWith(FOOBAR, bar)")
103 |
104 | // "alpha, beta, gamma, delta".endsWith("delta")
105 | assert("\u03B1\u03B2\u03B3\u03B4".ops.endsWith("\u03B4"), "endsWith(\u03B1\u03B2\u03B3\u03B4, \u03B4)")
106 | // "alpha, beta, gamma, delta".endsWith("gamma, DELTA")
107 | assert(!Some("\u03B1\u03B2\u03B3\u03B4").ops.endsWith("\u03B3\u0394"), "endsWith(\u03B1\u03B2\u03B3\u03B4, \u03B3\u0394)")
108 | }
109 |
110 | test("test ends with ignore case") {
111 | assert(nullString.ops.endsWithIgnoreCase(noneString), "endsWithIgnoreCase(null, null)")
112 | assert(!FOOBAR.ops.endsWithIgnoreCase(nullString), "endsWithIgnoreCase(FOOBAR, null)")
113 | assert(!nullString.ops.endsWithIgnoreCase(FOO), "endsWithIgnoreCase(null, FOO)")
114 | assert(FOOBAR.ops.endsWithIgnoreCase(""), "endsWithIgnoreCase(FOOBAR, \"\")")
115 |
116 | assert(!foobar.ops.endsWithIgnoreCase(foo), "endsWithIgnoreCase(foobar, foo)")
117 | assert(!FOOBAR.ops.endsWithIgnoreCase(FOO), "endsWithIgnoreCase(FOOBAR, FOO)")
118 | assert(!foobar.ops.endsWithIgnoreCase(FOO), "endsWithIgnoreCase(foobar, FOO)")
119 | assert(!FOOBAR.ops.endsWithIgnoreCase(foo), "endsWithIgnoreCase(FOOBAR, foo)")
120 |
121 | assert(!foo.ops.endsWithIgnoreCase(foobar), "endsWithIgnoreCase(foo, foobar)")
122 | assert(!bar.ops.endsWithIgnoreCase(Some(foobar)), "endsWithIgnoreCase(foo, foobar)")
123 |
124 | assert(foobar.ops.endsWithIgnoreCase(bar), "endsWithIgnoreCase(foobar, bar)")
125 | assert(Some(FOOBAR).ops.endsWithIgnoreCase(BAR), "endsWithIgnoreCase(FOOBAR, BAR)")
126 | assert(foobar.ops.endsWithIgnoreCase(BAR), "endsWithIgnoreCase(foobar, BAR)")
127 | assert(FOOBAR.ops.endsWithIgnoreCase(bar), "endsWithIgnoreCase(FOOBAR, bar)")
128 |
129 | // javadoc
130 | assert("abcdef".ops.endsWithIgnoreCase("def"))
131 | assert("ABCDEF".ops.endsWithIgnoreCase("def"))
132 | assert(!Some("ABCDEF").ops.endsWithIgnoreCase("cde"))
133 |
134 | // "alpha, beta, gamma, delta".endsWith("DELTA")
135 | assert("\u03B1\u03B2\u03B3\u03B4".ops.endsWithIgnoreCase("\u0394"), "endsWith(\u03B1\u03B2\u03B3\u03B4, \u0394)")
136 | // "alpha, beta, gamma, delta".endsWith("GAMMA")
137 | assert(!"\u03B1\u03B2\u03B3\u03B4".ops.endsWithIgnoreCase("\u0393"), "endsWith(\u03B1\u03B2\u03B3\u03B4, \u0393)")
138 | }
139 |
140 | test("test ends with any") {
141 | assert(!nullString.ops.endsWithAny(null.asInstanceOf[String]), "StringUtils.endsWithAny(null, null)")
142 | assert(!noneString.ops.endsWithAny("abc"), "StringUtils.endsWithAny(null, new String[] {abc})")
143 | assert(!"abcxyz".ops.endsWithAny(null.asInstanceOf[String]), "StringUtils.endsWithAny(abcxyz, null)")
144 | assert("abcxyz".ops.endsWithAny(""), "StringUtils.endsWithAny(abcxyz, new String[] {\"\"})")
145 | assert("abcxyz".ops.endsWithAny("xyz"), "StringUtils.endsWithAny(abcxyz, new String[] {xyz})")
146 | assert("abcxyz".ops.endsWithAny(null, "xyz", "abc"), "StringUtils.endsWithAny(abcxyz, new String[] {null, xyz, abc})")
147 | assert(!"defg".ops.endsWithAny(null, "xyz", "abc"), "StringUtils.endsWithAny(defg, new String[] {null, xyz, abc})")
148 | assert("abcXYZ".ops.endsWithAny("def", "XYZ"))
149 | assert(!"abcXYZ".ops.endsWithAny("def", "xyz"))
150 | assert("abcXYZ".ops.endsWithAny(Some("def"), Some("YZ")))
151 |
152 | /*
153 | * Type null of the last argument to method endsWithAny(CharSequence, CharSequence...)
154 | * doesn't exactly match the vararg parameter type.
155 | * Cast to CharSequence[] to confirm the non-varargs invocation,
156 | * or pass individual arguments of type CharSequence for a varargs invocation.
157 | *
158 | * assertFalse(StringUtils.endsWithAny("abcXYZ", null)); // replace with specific types to avoid warning
159 | */
160 | assert(!Some("abcXYZ").ops.endsWithAny(null.asInstanceOf[CharSequence]))
161 | assert(!"abcXYZ".ops.endsWithAny(null.asInstanceOf[Array[CharSequence]]: _*))
162 | assert("abcXYZ".ops.endsWithAny(""))
163 |
164 | assert(
165 | "abcxyz".ops.endsWithAny(new mutable.StringBuilder("abc"), new StringBuffer("xyz")),
166 | "StringUtils.endsWithAny(abcxyz, StringBuilder(abc), StringBuffer(xyz))"
167 | )
168 |
169 | }
170 | }
171 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsSubstringSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops.StringOptExt
4 | import org.scalatest.funsuite.AnyFunSuite
5 |
6 | /** TODO
7 | *
8 | * @author
9 | * mars
10 | * @version 1.0.0
11 | * @since 2022/09/11
12 | * 18:14
13 | */
14 | class StringUtilsSubstringSpec extends AnyFunSuite {
15 | private val FOO = "foo"
16 | private val BAR = "bar"
17 | private val BAZ = "baz"
18 | private val FOOBAR = "foobar"
19 | private val SENTENCE = "foo bar baz"
20 |
21 | import StringUtilsSpec.{noneString, nullString}
22 | test("test substring with start") {
23 | assert(noneString.ops.substring(0).isEmpty)
24 | assert(Some("").ops.substring(0).contains(""))
25 | assert("".ops.substring(2).contains(""))
26 |
27 | assert(SENTENCE.ops.substring(80).contains(""))
28 | assert(SENTENCE.ops.substring(8).contains(BAZ))
29 | assert(SENTENCE.ops.substring(-3).contains(BAZ))
30 | assert(SENTENCE.ops.substring(0).contains(SENTENCE))
31 | assert(Some("abc").ops.substring(-4).contains("abc"))
32 | assert("abc".ops.substring(-3).contains("abc"))
33 | assert("abc".ops.substring(-2).contains("bc"))
34 | assert("abc".ops.substring(-1).contains("c"))
35 | assert("abc".ops.substring(0).contains("abc"))
36 | assert("abc".ops.substring(1).contains("bc"))
37 | assert(Some("abc").ops.substring(2).contains("c"))
38 | assert("abc".ops.substring(3).contains(""))
39 | assert("abc".ops.substring(4).contains(""))
40 | }
41 |
42 | test("test substring with start and end") {
43 | assert(nullString.ops.substring(0, 0).isEmpty)
44 | assert(noneString.ops.substring(1, 2).isEmpty)
45 | assert("".ops.substring(0, 0).contains(""))
46 | assert(Some("").ops.substring(1, 2).contains(""))
47 | assert("".ops.substring(-2, -1).contains(""))
48 |
49 | assert("" == SENTENCE.ops.substring(8, 6).get)
50 | assert(FOO == SENTENCE.ops.substring(0, 3).get)
51 | assert("o" == SENTENCE.ops.substring(-9, 3).get)
52 | assert(FOO == SENTENCE.ops.substring(0, -8).get)
53 | assert("o" == SENTENCE.ops.substring(-9, -8).get)
54 | assert(SENTENCE == SENTENCE.ops.substring(0, 80).get)
55 | assert("" == SENTENCE.ops.substring(2, 2).get)
56 | assert("b" == "abc".ops.substring(-2, -1).get)
57 | }
58 |
59 | test("test string left") {
60 | assert(noneString.ops.left(-1).isEmpty)
61 | assert(nullString.ops.left(0).isEmpty)
62 | assert(noneString.ops.left(2).isEmpty)
63 |
64 | assert("".ops.left(-1).contains(""))
65 | assert("".ops.left(0).contains(""))
66 | assert("".ops.left(2).contains(""))
67 |
68 | assert(FOOBAR.ops.left(-1).contains(""))
69 | assert(FOOBAR.ops.left(0).contains(""))
70 | assert(FOOBAR.ops.left(3).contains(FOO))
71 | assert(FOOBAR.ops.left(80).contains(FOOBAR))
72 | }
73 |
74 | test("test string right") {
75 | assert(nullString.ops.right(-1).isEmpty)
76 | assert(noneString.ops.right(0).isEmpty)
77 | assert(nullString.ops.right(2).isEmpty)
78 |
79 | assert("".ops.right(-1).contains(""))
80 | assert("".ops.right(0).contains(""))
81 | assert("".ops.right(2).contains(""))
82 |
83 | assert(FOOBAR.ops.right(-1).contains(""))
84 | assert(FOOBAR.ops.right(0).contains(""))
85 | assert(Some(FOOBAR).ops.right(3).contains(BAR))
86 | assert(FOOBAR.ops.right(80).contains(FOOBAR))
87 | }
88 |
89 | test("test string mid") {
90 | assert(nullString.ops.mid(-1, 0).isEmpty)
91 | assert(noneString.ops.mid(0, -1).isEmpty)
92 | assert(nullString.ops.mid(3, 0).isEmpty)
93 | assert(noneString.ops.mid(3, 2).isEmpty)
94 |
95 | assert("".ops.mid(0, -1).contains(""))
96 | assert("".ops.mid(0, 0).contains(""))
97 | assert("".ops.mid(0, 2).contains(""))
98 |
99 | assert(FOOBAR.ops.mid(3, -1).contains(""))
100 | assert(FOOBAR.ops.mid(3, 0).contains(""))
101 | assert(FOOBAR.ops.mid(3, 1).contains("b"))
102 | assert(FOOBAR.ops.mid(0, 3).contains(FOO))
103 | assert(FOOBAR.ops.mid(3, 3).contains(BAR))
104 | assert(FOOBAR.ops.mid(0, 80).contains(FOOBAR))
105 | assert(FOOBAR.ops.mid(3, 80).contains(BAR))
106 | assert(FOOBAR.ops.mid(9, 3).contains(""))
107 | assert(FOOBAR.ops.mid(-1, 3).contains(FOO))
108 | }
109 |
110 | test("test string substring before separator char") {
111 | assert("fooXXbarXXbaz".ops.substringBefore('X').contains("foo"))
112 |
113 | assert(nullString.ops.substringBefore(0).isEmpty)
114 | assert(noneString.ops.substringBefore('X').isEmpty)
115 | assert("".ops.substringBefore(0).contains(""))
116 | assert("".ops.substringBefore('X').contains(""))
117 |
118 | assert(Some("foo").ops.substringBefore(0).contains("foo"))
119 | assert("foo".ops.substringBefore('b').contains("foo"))
120 | assert("foot".ops.substringBefore('o').contains("f"))
121 | assert("abc".ops.substringBefore('a').contains(""))
122 | assert("abcba".ops.substringBefore('b').contains("a"))
123 | assert("abc".ops.substringBefore('c').contains("ab"))
124 | assert("abc".ops.substringBefore(0).contains("abc"))
125 | }
126 |
127 | test("test string substring before separator string") {
128 | assert(Some("fooXXbarXXbaz").ops.substringBefore("XX").contains("foo"))
129 |
130 | assert(noneString.ops.substringBefore(noneString).isEmpty)
131 | assert(nullString.ops.substringBefore("").isEmpty)
132 | assert(noneString.ops.substringBefore("XX").isEmpty)
133 | assert("".ops.substringBefore(nullString).contains(""))
134 | assert("".ops.substringBefore("").contains(""))
135 | assert("".ops.substringBefore("XX").contains(""))
136 |
137 | assert(Some("foo").ops.substringBefore[String](null).contains("foo"))
138 | assert("foo".ops.substringBefore("b").contains("foo"))
139 | assert("foot".ops.substringBefore("o").contains("f"))
140 | assert("abc".ops.substringBefore("a").contains(""))
141 | assert("abcba".ops.substringBefore("b").contains("a"))
142 | assert("abc".ops.substringBefore("c").contains("ab"))
143 | assert("abc".ops.substringBefore("").contains(""))
144 | assert("abc".ops.substringBefore("X").contains("abc"))
145 | }
146 |
147 | test("test string substring after separator string") {
148 | assert("fooXXbarXXbaz".ops.substringAfter("XX").contains("barXXbaz"))
149 |
150 | assert(noneString.ops.substringAfter[String](null).isEmpty)
151 | assert(noneString.ops.substringAfter("").isEmpty)
152 | assert(nullString.ops.substringAfter("XX").isEmpty)
153 | assert("".ops.substringAfter[String](null).contains(""))
154 | assert("".ops.substringAfter("").contains(""))
155 | assert(Some("").ops.substringAfter(Some("XX")).contains(""))
156 |
157 | assert("foo".ops.substringAfter(noneString).contains(""))
158 | assert("foot".ops.substringAfter("o").contains("ot"))
159 | assert("abc".ops.substringAfter(Some("a")).contains("bc"))
160 | assert(Some("abcba").ops.substringAfter("b").contains("cba"))
161 | assert("abc".ops.substringAfter("c").contains(""))
162 | assert("abc".ops.substringAfter("").contains("abc"))
163 | assert("abc".ops.substringAfter("d").contains(""))
164 | }
165 |
166 | test("test string substring after separator char") {
167 | assert(noneString.ops.substringAfter(0).isEmpty)
168 | assert(nullString.ops.substringAfter('X').isEmpty)
169 | assert("".ops.substringAfter(0).contains(""))
170 | assert(Some("").ops.substringAfter('X').contains(""))
171 |
172 | assert("foo".ops.substringAfter(0).contains(""))
173 | assert("foot".ops.substringAfter('o').contains("ot"))
174 | assert("abc".ops.substringAfter('a').contains("bc"))
175 | assert("abcba".ops.substringAfter('b').contains("cba"))
176 | assert("abc".ops.substringAfter('c').contains(""))
177 | assert("abc".ops.substringAfter('d').contains(""))
178 | }
179 |
180 | test("test string substring before last separator") {
181 | assert("fooXXbarXXbaz".ops.substringBeforeLast("XX").contains("fooXXbar"))
182 |
183 | assert(nullString.ops.substringBeforeLast(noneString).isEmpty)
184 | assert(noneString.ops.substringBeforeLast("").isEmpty)
185 | assert(nullString.ops.substringBeforeLast("XX").isEmpty)
186 | assert("".ops.substringBeforeLast(noneString).contains(""))
187 | assert(Some("").ops.substringBeforeLast("").contains(""))
188 | assert("".ops.substringBeforeLast(Some("XX")).contains(""))
189 |
190 | assert("foo".ops.substringBeforeLast(nullString).contains("foo"))
191 | assert(Some("foo").ops.substringBeforeLast("b").contains("foo"))
192 | assert("foo".ops.substringBeforeLast("o").contains("fo"))
193 | assert("abc\r\n".ops.substringBeforeLast("d").contains("abc\r\n"))
194 | assert("abcdabc".ops.substringBeforeLast("d").contains("abc"))
195 | assert("abcdabcd".ops.substringBeforeLast(Some("d")).contains("abcdabc"))
196 | assert("abc".ops.substringBeforeLast("b").contains("a"))
197 | assert("abc \n".ops.substringBeforeLast("\n").contains("abc "))
198 | assert("a".ops.substringBeforeLast(noneString).contains("a"))
199 | assert("a".ops.substringBeforeLast("").contains("a"))
200 | assert("a".ops.substringBeforeLast("a").contains(""))
201 | }
202 |
203 | test("test string substring after last separator") {
204 | assert("fooXXbarXXbaz".ops.substringAfterLast("XX").contains("baz"))
205 |
206 | assert(nullString.ops.substringAfterLast(nullString).isEmpty)
207 | assert(nullString.ops.substringAfterLast(Some("")).isEmpty)
208 | assert(noneString.ops.substringAfterLast("XX").isEmpty)
209 | assert("".ops.substringAfterLast(noneString).contains(""))
210 | assert("".ops.substringAfterLast("").contains(""))
211 | assert("".ops.substringAfterLast("a").contains(""))
212 |
213 | assert("foo".ops.substringAfterLast(nullString).contains(""))
214 | assert("foo".ops.substringAfterLast("b").contains(""))
215 | assert(Some("foot").ops.substringAfterLast("o").contains("t"))
216 | assert("abc".ops.substringAfterLast(Some("a")).contains("bc"))
217 | assert("abcba".ops.substringAfterLast("b").contains("a"))
218 | assert("abc".ops.substringAfterLast("c").contains(""))
219 | assert("".ops.substringAfterLast("d").contains(""))
220 | assert("abc".ops.substringAfterLast("").contains(""))
221 | }
222 |
223 | test("test string substring after last separator char") {
224 | assert(nullString.ops.substringAfterLast(0).isEmpty)
225 | assert(noneString.ops.substringAfterLast('X').isEmpty)
226 | assert("".ops.substringAfterLast(0).contains(""))
227 | assert(Some("").ops.substringAfterLast('a').contains(""))
228 |
229 | assert("foo".ops.substringAfterLast(0).contains(""))
230 | assert("foo".ops.substringAfterLast('b').contains(""))
231 | assert(Some("foot").ops.substringAfterLast('o').contains("t"))
232 | assert("abc".ops.substringAfterLast('a').contains("bc"))
233 | assert("abcba".ops.substringAfterLast('b').contains("a"))
234 | assert("abc".ops.substringAfterLast('c').contains(""))
235 | assert("".ops.substringAfterLast('d').contains(""))
236 | }
237 |
238 | test("test string substring between tag") {
239 | assert(noneString.ops.substringBetween("tag").isEmpty)
240 | assert(Some("").ops.substringBetween("").contains(""))
241 | assert("".ops.substringBetween(Some("abc")).isEmpty)
242 | assert(" ".ops.substringBetween(" ").contains(""))
243 | assert("abc".ops.substringBetween(noneString).isEmpty)
244 | assert("abc".ops.substringBetween("").contains(""))
245 | assert("abc".ops.substringBetween(Some("a")).isEmpty)
246 | assert(Some("abca").ops.substringBetween("a").contains("bc"))
247 | assert("abcabca".ops.substringBetween("a").contains("bc"))
248 | assert("\nbar\n".ops.substringBetween("\n").contains("bar"))
249 | }
250 |
251 | test("test string substring between open and close string") {
252 | assert(noneString.ops.substringBetween("", "").isEmpty)
253 | assert("".ops.substringBetween(nullString, "").isEmpty)
254 | assert(Some("").ops.substringBetween(Some(""), noneString).isEmpty)
255 | assert("".ops.substringBetween("", "").contains(""))
256 | assert("foo".ops.substringBetween("", "").contains(""))
257 | assert("foo".ops.substringBetween(Some(""), Some("]")).isEmpty)
258 | assert("foo".ops.substringBetween("[", "]").isEmpty)
259 | assert(" ".ops.substringBetween(" ", " ").contains(""))
260 | assert("bar".ops.substringBetween("", "").contains("bar"))
261 | }
262 |
263 | test("test strings substring between open and close") {
264 | var results = "[one], [two], [three]".ops.substringsBetween("[", "]").get
265 | assert(3 == results.length)
266 | assert("one" == results(0))
267 | assert("two" == results(1))
268 | assert("three" == results(2))
269 |
270 | results = "[one], [two], three".ops.substringsBetween(Some("["), Some("]")).get
271 | assert(2 == results.length)
272 | assert("one" == results(0))
273 | assert("two" == results(1))
274 |
275 | results = "[one], [two], three]".ops.substringsBetween("[", "]").get
276 | assert(2 == results.length)
277 | assert("one" == results(0))
278 | assert("two" == results(1))
279 |
280 | results = "[one], two], three]".ops.substringsBetween("[", "]").get
281 | assert(1 == results.length)
282 | assert("one" == results(0))
283 |
284 | results = "one], two], [three]".ops.substringsBetween("[", "]").get
285 | assert(1 == results.length)
286 | assert("three" == results(0))
287 |
288 | // 'ab hello ba' will match, but 'ab non ba' won't
289 | // this is because the 'a' is shared between the two and can't be matched twice
290 | results = "aabhellobabnonba".ops.substringsBetween("ab", "ba").get
291 | assert(1 == results.length)
292 | assert("hello" == results(0))
293 |
294 | results = "one, two, three".ops.substringsBetween("[", "]").orNull
295 | assert(results == null)
296 |
297 | results = "[one, two, three".ops.substringsBetween("[", "]").orNull
298 | assert(results == null)
299 |
300 | results = "one, two, three]".ops.substringsBetween("[", "]").orNull
301 | assert(results == null)
302 |
303 | results = "[one], [two], [three]".ops.substringsBetween("[", null).orNull
304 | assert(results == null)
305 |
306 | results = "[one], [two], [three]".ops.substringsBetween(noneString, Some("]")).orNull
307 | assert(results == null)
308 |
309 | results = "[one], [two], [three]".ops.substringsBetween("", "").orNull
310 | assert(results == null)
311 |
312 | results = noneString.ops.substringsBetween("[", "]").orNull
313 | assert(results == null)
314 |
315 | results = "".ops.substringsBetween("[", "]").get
316 | assert(0 == results.length)
317 | }
318 |
319 | test("test string count matches with string") {
320 | assert(0 == nullString.ops.countMatches(noneString))
321 | assert(0 == Some("blah").ops.countMatches(nullString))
322 | assert(0 == nullString.ops.countMatches("DD"))
323 |
324 | assert(0 == "x".ops.countMatches(""))
325 | assert(0 == "".ops.countMatches(""))
326 |
327 | assert(3 == "one long someone sentence of one".ops.countMatches("one"))
328 | assert(0 == "one long someone sentence of one".ops.countMatches("two"))
329 | assert(4 == "oooooooooooo".ops.countMatches("ooo"))
330 | assert(0 == noneString.ops.countMatches("?"))
331 | assert(0 == "".ops.countMatches(Some("?")))
332 | assert(0 == "abba".ops.countMatches(noneString))
333 | assert(0 == "abba".ops.countMatches(""))
334 | assert(2 == Some("abba").ops.countMatches("a"))
335 | assert(1 == "abba".ops.countMatches("ab"))
336 | assert(0 == "abba".ops.countMatches("xxx"))
337 | assert(1 == "ababa".ops.countMatches("aba"))
338 | }
339 |
340 | test("test string count matches with char") {
341 | assert(0 == nullString.ops.countMatches('D'))
342 | assert(5 == "one long someone sentence of one".ops.countMatches(' '))
343 | assert(6 == "one long someone sentence of one".ops.countMatches('o'))
344 | assert(4 == "oooooooooooo".ops.countMatches("ooo"))
345 | }
346 | }
347 |
--------------------------------------------------------------------------------
/modules/bridge/src/test/scala/commons/lang3/bridge/StringUtilsTrimStripSpec.scala:
--------------------------------------------------------------------------------
1 | package commons.lang3.bridge
2 |
3 | import commons.lang3.bridge.StringUtils.ops.StringOptExt
4 | import commons.lang3.bridge.StringUtilsSpec._
5 | import org.scalatest.funsuite.AnyFunSuite
6 |
7 | /** TODO
8 | *
9 | * @author
10 | * mars
11 | * @version 1.0.0
12 | * @since 2022/09/11
13 | * 23:26
14 | */
15 | class StringUtilsTrimStripSpec extends AnyFunSuite {
16 | private val FOO = "foo"
17 |
18 | test("test trim") {
19 | assert(FOO == (FOO + " ").ops.trim.get)
20 | assert(FOO == (" " + FOO + " ").ops.trim.get)
21 | assert(FOO == (" " + FOO).ops.trim.get)
22 | assert(FOO == (FOO + "").ops.trim.get)
23 | assert(" \t\r\n\b ".ops.trim.contains(""))
24 | assert(TRIMMABLE.ops.trim.contains(""))
25 | assert(NON_TRIMMABLE == NON_TRIMMABLE.ops.trim.get)
26 | assert(Some("").ops.trim.contains(""))
27 | assert(noneString.ops.trim.isEmpty)
28 | }
29 |
30 | test("test string trim to null") {
31 | assert(FOO == (FOO + " ").ops.trimToNone.get)
32 | assert(FOO == (" " + FOO + " ").ops.trimToNone.get)
33 | assert(FOO == (" " + FOO).ops.trimToNone.get)
34 | assert(FOO == (FOO + "").ops.trimToNone.get)
35 | assert(Some(" \t\r\n\b ").ops.trimToNone.isEmpty)
36 | assert(TRIMMABLE.ops.trimToNone.isEmpty)
37 | assert(NON_TRIMMABLE == NON_TRIMMABLE.ops.trimToNone.get)
38 | assert("".ops.trimToNone.isEmpty)
39 | assert(noneString.ops.trimToNone.isEmpty)
40 | }
41 |
42 | test("test string trim to empty") {
43 | assert(FOO == (FOO + " ").ops.trimToEmpty.get)
44 | assert(FOO == (" " + FOO + " ").ops.trimToEmpty.get)
45 | assert(FOO == Some(" " + FOO).ops.trimToEmpty.get)
46 | assert(FOO == (FOO + "").ops.trimToEmpty.get)
47 | assert("" == " \t\r\n\b ".ops.trimToEmpty.get)
48 | assert("" == TRIMMABLE.ops.trimToEmpty.get)
49 | assert(NON_TRIMMABLE == NON_TRIMMABLE.ops.trimToEmpty.get)
50 | assert("" == "".ops.trimToEmpty.get)
51 | assert("" == noneString.ops.trimToEmpty.get)
52 | }
53 |
54 | test("test string strip") {
55 | assert(nullString.ops.strip.isEmpty)
56 | assert(Some("").ops.strip.contains(""))
57 | assert(" ".ops.strip.contains(""))
58 | assert(" abc ".ops.strip.contains("abc"))
59 | assert(NON_WHITESPACE == (WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.strip.get)
60 | }
61 |
62 | test("test string strip to null") {
63 | assert(noneString.ops.stripToNone.isEmpty)
64 | assert("".ops.stripToNone.isEmpty)
65 | assert(Some(" ").ops.stripToNone.isEmpty)
66 | assert(WHITESPACE.ops.stripToNone.isEmpty)
67 | assert(" ab c ".ops.stripToNone.contains("ab c"))
68 | assert((WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.stripToNone.contains(NON_WHITESPACE))
69 | }
70 |
71 | test("test strip to empty") {
72 | assert("" == noneString.ops.stripToEmpty.get)
73 | assert("" == Some("").ops.stripToEmpty.get)
74 | assert("" == " ".ops.stripToEmpty.get)
75 | assert(WHITESPACE.ops.stripToEmpty.contains(""))
76 | assert(" ab c ".ops.stripToEmpty.contains("ab c"))
77 | assert((WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.stripToEmpty.contains(NON_WHITESPACE))
78 | }
79 |
80 | test("test string strip with strip chars") {
81 | // null strip
82 | assert(nullString.ops.strip(nullString).isEmpty)
83 | assert("".ops.strip(nullString).contains(""))
84 | assert(" ".ops.strip(noneString).contains(""))
85 | assert(" abc ".ops.strip(noneString).contains("abc"))
86 | assert(Some(WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.strip[String](null).contains(NON_WHITESPACE))
87 |
88 | // "" strip
89 | assert(nullString.ops.strip("").isEmpty)
90 | assert(Some("").ops.strip("").contains(""))
91 | assert(" ".ops.strip("").contains(" "))
92 | assert(Some(" abc ").ops.strip(Some("")).contains(" abc "))
93 | assert(WHITESPACE.ops.strip("").contains(WHITESPACE))
94 |
95 | // " " strip
96 | assert(noneString.ops.strip(" ").isEmpty)
97 | assert("".ops.strip(" ").contains(""))
98 | assert(" ".ops.strip(" ").contains(""))
99 | assert(" abc ".ops.strip(" ").contains("abc"))
100 |
101 | // "ab" strip
102 | assert(nullString.ops.strip("ab").isEmpty)
103 | assert("".ops.strip("ab").contains(""))
104 | assert(" ".ops.strip("ab").contains(" "))
105 | assert(" abc ".ops.strip("ab").contains(" abc "))
106 | assert("abcabab".ops.strip("ab").contains("c"))
107 | assert(WHITESPACE.ops.strip("").contains(WHITESPACE))
108 | }
109 |
110 | test("test string strip start with strip chars string") {
111 | // null stripStart
112 | assert(noneString.ops.stripStart(nullString).isEmpty)
113 | assert("".ops.stripStart(nullString).contains(""))
114 | assert(Some(" ").ops.stripStart(nullString).contains(""))
115 | assert(" abc ".ops.stripStart(noneString).contains("abc "))
116 | assert((WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.stripStart(nullString).contains(NON_WHITESPACE + WHITESPACE))
117 |
118 | // "" stripStart
119 | assert(noneString.ops.stripStart("").isEmpty)
120 | assert("".ops.stripStart("").contains(""))
121 | assert(Some(" ").ops.stripStart("").contains(" "))
122 | assert(" abc ".ops.stripStart("").contains(" abc "))
123 | assert(WHITESPACE.ops.stripStart("").contains(WHITESPACE))
124 |
125 | // " " stripStart
126 | assert(nullString.ops.stripStart(" ").isEmpty)
127 | assert("".ops.stripStart(" ").contains(""))
128 | assert(Some(" ").ops.stripStart(" ").contains(""))
129 | assert(" abc ".ops.stripStart(" ").contains("abc "))
130 |
131 | // "ab" stripStart
132 | assert(nullString.ops.stripStart("ab").isEmpty)
133 | assert("".ops.stripStart("ab").contains(""))
134 | assert(" ".ops.stripStart("ab").contains(" "))
135 | assert(" abc ".ops.stripStart(Some("ab")).contains(" abc "))
136 | assert("abcabab".ops.stripStart("ab").contains("cabab"))
137 | assert(Some(WHITESPACE).ops.stripStart("").contains(WHITESPACE))
138 | }
139 |
140 | test("test string strip end with strip chars string") {
141 | // null stripEnd
142 | assert(nullString.ops.stripEnd(nullString).isEmpty)
143 | assert("".ops.stripEnd(nullString).contains(""))
144 | assert(" ".ops.stripEnd(noneString).contains(""))
145 | assert(" abc ".ops.stripEnd(null).contains(" abc"))
146 | assert(Some(WHITESPACE + NON_WHITESPACE + WHITESPACE).ops.stripEnd(noneString).contains(WHITESPACE + NON_WHITESPACE))
147 |
148 | // "" stripEnd
149 | assert(nullString.ops.stripEnd("").isEmpty)
150 | assert(Some("").ops.stripEnd("").contains(""))
151 | assert(" ".ops.stripEnd(Some("")).contains(" "))
152 | assert(Some(" abc ").ops.stripEnd("").contains(" abc "))
153 | assert(WHITESPACE.ops.stripEnd("").contains(WHITESPACE))
154 |
155 | // " " stripEnd
156 | assert(nullString.ops.stripEnd(" ").isEmpty)
157 | assert("".ops.stripEnd(" ").contains(""))
158 | assert(" ".ops.stripEnd(" ").contains(""))
159 | assert(" abc ".ops.stripEnd(" ").contains(" abc"))
160 |
161 | // "ab" stripEnd
162 | assert(noneString.ops.stripEnd("ab").isEmpty)
163 | assert("".ops.stripEnd("ab").contains(""))
164 | assert(" ".ops.stripEnd(Some("ab")).contains(" "))
165 | assert(" abc ".ops.stripEnd(Some("ab")).contains(" abc "))
166 | assert(Some("abcabab").ops.stripEnd("ab").contains("abc"))
167 | assert(WHITESPACE.ops.stripEnd("").contains(WHITESPACE))
168 | }
169 |
170 | test("test string strip accents") {
171 | val cue = "\u00C7\u00FA\u00EA"
172 | assert(cue.ops.stripAccents.contains("Cue"), "Failed to strip accents from " + cue)
173 |
174 | val lots =
175 | "\u00C0\u00C1\u00C2\u00C3\u00C4\u00C5\u00C7\u00C8\u00C9" + "\u00CA\u00CB\u00CC\u00CD\u00CE\u00CF\u00D1\u00D2\u00D3" + "\u00D4\u00D5\u00D6\u00D9\u00DA\u00DB\u00DC\u00DD"
176 | assert(lots.ops.stripAccents.contains("AAAAAACEEEEIIIINOOOOOUUUUY"), "Failed to strip accents from " + lots)
177 |
178 | assert(nullString.ops.stripAccents.isEmpty, "Failed null safety")
179 | assert(Some("").ops.stripAccents.contains(""), "Failed empty String")
180 | assert("control".ops.stripAccents.contains("control"), "Failed to handle non-accented text")
181 | assert("\u00E9clair".ops.stripAccents.contains("eclair"), "Failed to handle easy example")
182 | assert(
183 | ("\u0104\u0141\u00D3\u015A\u017B\u0179\u0106\u0143 " + "\u0105\u0142\u00F3\u015B\u017C\u017A\u0107\u0144").ops.stripAccents
184 | .contains("ALOSZZCN aloszzcn")
185 | )
186 | }
187 | }
188 |
--------------------------------------------------------------------------------
/project/CommonSettings.scala:
--------------------------------------------------------------------------------
1 | import sbt._
2 | import sbt.Keys._
3 | import ProjectKeys._
4 |
5 | import djx.sbt.depts.output.Djx314DeptsPlugin.autoImport.scalaV
6 |
7 | object CommonSettings {
8 |
9 | // See https://www.scala-sbt.org/1.x/docs/Using-Sonatype.html for instructions on how to publish to Sonatype.
10 | private def scalacOptionsVersion(scalaVersion: Option[(Long, Long)]): Seq[String] = {
11 | val common = Seq(
12 | "-unchecked",
13 | "-deprecation",
14 | // "-Xfatal-warnings",
15 | "-encoding",
16 | "UTF-8"
17 | )
18 | val compat = scalaVersion match {
19 | case Some((2, scalaMajor)) if scalaMajor == 11 => Seq("-Xexperimental", "-Xlint", "-Ywarn-dead-code")
20 | case Some((3, scalaMajor)) => Seq("-Ykind-projector")
21 | case _ => Nil
22 | }
23 | common ++ compat
24 | }
25 |
26 | private def genDirectory(sourceFile: File, c: String, parVersion: Option[(Long, Long)]): Seq[File] = {
27 | val common = sourceFile / c / "scala"
28 | val compat = parVersion match {
29 | case Some((2, 11)) =>
30 | Seq(sourceFile / c / "scala-2", sourceFile / c / "scala-2.11", sourceFile / c / "scala-2.11-2.12")
31 | case Some((2, 12)) =>
32 | Seq(
33 | sourceFile / c / "scala-2",
34 | sourceFile / c / "scala-2.11-2.12",
35 | sourceFile / c / "scala-2.12",
36 | sourceFile / c / "scala-2.12-2.13"
37 | )
38 | case Some((2, 13)) =>
39 | Seq(sourceFile / c / "scala-2", sourceFile / c / "scala-2.12-2.13", sourceFile / c / "scala-2.13")
40 | case Some((2, _)) => Seq(sourceFile / c / "scala-2")
41 | case Some((3, _)) => Seq(sourceFile / c / "scala-3")
42 | case _ => Seq.empty
43 | }
44 | common +: compat
45 | }
46 |
47 | val supportedScalaVersions = Seq(scalaV.v211, scalaV.v212, scalaV.v213, scalaV.v3)
48 |
49 | val pushSettings = Seq(
50 | version := "0.1.0",
51 | organization := "net.scalax",
52 | organizationName := "Scala Workers",
53 | organizationHomepage := Some(url("https://github.com/scala-workers")),
54 | scmInfo := Some(
55 | ScmInfo(
56 | url("https://github.com/scala-workers/commons-lang3-bridge"),
57 | "scm:git@github.com:scala-workers/commons-lang3-bridge.git"
58 | )
59 | ),
60 | developers := List(
61 | Developer(
62 | id = "Mars Liu",
63 | name = "Liu Xin",
64 | email = "mars.liu@outlook.com",
65 | url = url("https://marchliu.github.io/")
66 | ),
67 | Developer(
68 | id = "djx314",
69 | name = "djx314",
70 | email = "djx314@sina.cn",
71 | url = url("https://github.com/djx314")
72 | )
73 | ),
74 | description := "Scala Bridge For Apache Commons Lang3 Library",
75 | licenses := List("Apache" -> new URL("https://github.com/scala-workers/commons-lang3-bridge/blob/master/LICENSE")),
76 | homepage := Some(url("https://github.com/scala-workers/commons-lang3-bridge")),
77 | // Remove all additional repository other than Maven Central from POM
78 | pomIncludeRepository := { _ => false },
79 | publishTo := {
80 | val nexus = "https://s01.oss.sonatype.org/"
81 | if (isSnapshot.value) Some("snapshots" at nexus + "content/repositories/snapshots")
82 | else Some("releases" at nexus + "service/local/staging/deploy/maven2")
83 | },
84 | publishMavenStyle := true
85 | )
86 |
87 | private val commonSetting = Seq(
88 | parVersion := CrossVersion.partialVersion(scalaVersion.value),
89 | scalaVersion := scalaV.v213,
90 | scalacOptions := scalacOptionsVersion(parVersion.value),
91 | org.scalafmt.sbt.ScalafmtPlugin.autoImport.scalafmtOnCompile := true,
92 | Compile / unmanagedSourceDirectories ++= {
93 | val addToMain = genDirectory(sourceDirectory.value, "main", parVersion.value)
94 | val addToCodeGen = genDirectory(sourceDirectory.value, "codegen", parVersion.value)
95 | addToMain ++: addToCodeGen
96 | },
97 | Test / unmanagedSourceDirectories ++= genDirectory(sourceDirectory.value, "test", parVersion.value)
98 | )
99 |
100 | val commonProjectSettings = pushSettings ++ commonSetting ++ Seq(crossScalaVersions := supportedScalaVersions)
101 | val codegenProjectSettings = commonSetting
102 |
103 | }
104 |
--------------------------------------------------------------------------------
/project/ProjectKeys.scala:
--------------------------------------------------------------------------------
1 | import sbt._
2 | import sbt.Keys._
3 |
4 | object ProjectKeys {
5 | val parVersion = settingKey[Option[(Long, Long)]]("parVersion")
6 | }
7 |
--------------------------------------------------------------------------------
/project/build.properties:
--------------------------------------------------------------------------------
1 | sbt.version=1.9.6
2 |
--------------------------------------------------------------------------------
/project/plugins.sbt:
--------------------------------------------------------------------------------
1 | import djx.sbt.depts.plugins.{PluginsCollection => projectPlugins}
2 |
3 | addSbtPlugin(projectPlugins.`sbt-scalafmt`)
4 | addSbtPlugin(projectPlugins.`sbt-twirl`)
5 | addSbtPlugin(projectPlugins.`sbt-sonatype`)
6 | addSbtPlugin(projectPlugins.`sbt-pgp`)
7 |
--------------------------------------------------------------------------------
/project/project/sbt-depts-djx314-lib.sbt:
--------------------------------------------------------------------------------
1 | libraryDependencies += "net.scalax.djx314" %% "sbt-depts-djx314-plugins" % "0.0.1-M768"
2 |
--------------------------------------------------------------------------------
/project/sbt-depts-plugin.sbt:
--------------------------------------------------------------------------------
1 | addSbtPlugin("net.scalax.djx314" % "sbt-depts-djx314" % "0.0.1-M768")
2 |
--------------------------------------------------------------------------------