/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
true == true
true == true

false == false
true == true

false == false
true == true

false == false
true == true

false == false
false == false
false == false
true == true
true == true
true == true

false == false
false == false
true == true
true == true
true == true
true == true


Lower 'c'-words:
- coverage
- considered

Any 'c'-words:
- Code
- coverage
- considered

Lower line-last words:
- coverage

Any line-last words:
- coverage
- BROKEN

Any last words:
- BROKEN

c-word with follower:
- "Code without"
  Groups: "Code without", "Code", "without"
- "coverage\nis"
  Groups: "coverage\nis", "coverage", "is"
- "considered to"
  Groups: "considered to", "considered", "to"

c-word with follower in the same line:
- Code without
- considered to

Lower c-word with follower in the same line:
- considered to

  Ignored but logged in 2.3: False == False
  Ignored but logged in 2.3: False == False

FOObar == FOObar
Foobar == Foobar
FOObar == FOObar
FOObarFOO == FOObarFOO
FOObarfOO == FOObarfOO
FOObarfOO == FOObarfOO
Foobar == Foobar
FOObar == FOObar
FOObarFOO == FOObarFOO
FOObarfOO == FOObarfOO
FOObarfOO == FOObarfOO
foobar == foobar
foobar == foobar
FOObar == FOObar
FOObarFOO == FOObarFOO
FOObarfOo == FOObarfOo
FAlse == FAlse
FAlse == FAlse

  Ignored but logged in 2.3: FOObar

[foo, barxbaaz] == [foo, barxbaaz]
[foo, barxbaaz] == [foo, barxbaaz]
[foo, bar, baaz] == [foo, bar, baaz]
[foo, barxbaaz] == [foo, barxbaaz]
[foo, bar, baaz] == [foo, bar, baaz]
[fooXXbarxxbaaz] == [fooXXbarxxbaaz]
[foo, bar, baaz] == [foo, bar, baaz]
[F, ls] == [F, ls]
[Fals, ] == [Fals, ]