void verify(ErrorCollector errorCollector, @Nullable List<Object> values, @Nullable String text, int line, int column, @Nullable String message) {
      String description = null;
      int idxActual = values.indexOf(left);
      int idxExpected = values.indexOf(right);

      if (isIterableOrArray(left) && isIterableOrArray(right)) {
        if (SpockRuntime.MATCH_COLLECTIONS_AS_SET.equals(method)) {
          Set<?> actual = GroovyRuntimeUtil.coerce(left, LinkedHashSet.class);
          Set<?> expected = GroovyRuntimeUtil.coerce(right, LinkedHashSet.class);
          if (GroovyRuntimeUtil.equals(actual, expected)) {
            return;
          }
          // replace arguments with coerced Set values
          values.set(idxActual, actual);
          values.set(idxExpected, expected);

        } else {
          Object localLeft = convertArrayToCollectionIfNecessary(left);
          Object localRight = convertArrayToCollectionIfNecessary(right);
          Matcher<?> matcher = StreamSupport.stream(((Iterable<?>)localRight).spliterator(), false)
            .map(CoreMatchers::equalTo)
            .collect(Collectors.collectingAndThen(toList(), IsIterableContainingInAnyOrder::containsInAnyOrder));

          if (HamcrestFacade.matches(matcher, localLeft)) {
            return;
          }
          description = HamcrestFacade.getFailureDescription(matcher, left, message);
        }
        // we have a mismatch, so add false for the result
        // due to the way the ValueRecorder works, we have two (n/a) values at the end, so we need to skip them
        values.add(values.size() - 2, false);
      } else if (left == null || right == null) {
        values.set(idxActual, left);
        values.set(idxExpected, right);
        if (left == null && right == null) {
          return;
        }
        values.set(3, false);
      } else {
        Pattern pattern = Pattern.compile(String.valueOf(right));
        java.util.regex.Matcher matcher = pattern.matcher(String.valueOf(left));

        values.set(idxActual, left);
        values.set(idxExpected, right);

        if (SpockRuntime.MATCH_COLLECTIONS_AS_SET.equals(method)) {
          if (matcher.find()) {
            return;
          }
          values.set(3, matcher);
        } else {
          if (matcher.matches()) {
            return;
          }
          values.set(3, false);
        }
      }

      // this contains the synthetic method name, so remove it
      values.remove(0);
      Condition condition = new Condition(values, text, TextPosition.create(line, column), description, null, null);
      errorCollector.collectOrThrow(new ConditionNotSatisfiedError(condition));
    }
A condition of the form "foo equalTo(bar)" or "that(foo, equalTo(bar)"
or "expect(foo, equalTo(bar)", where 'equalTo' returns a Hamcrest matcher.
spock-core/src/main/java/org/spockframework/runtime/SpockRuntime.java