/*
 * Licensed 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.
 */
package io.prestosql.sql.planner.iterative.rule.test;

import com.google.common.collect.ImmutableList;
import io.prestosql.matching.Captures;
import io.prestosql.matching.Pattern;
import io.prestosql.sql.planner.iterative.Rule;
import io.prestosql.sql.planner.plan.Assignments;
import io.prestosql.sql.planner.plan.PlanNode;
import org.testng.annotations.Test;

import static io.prestosql.sql.planner.assertions.PlanMatchPattern.values;
import static io.prestosql.sql.planner.iterative.rule.test.PlanBuilder.expression;
import static io.prestosql.sql.planner.iterative.rule.test.RuleTester.defaultRuleTester;

public class TestRuleTester
{
    @Test(expectedExceptions = AssertionError.class, expectedExceptionsMessageRegExp = "Plan does not match, expected .* but found .*")
    public void testReportWrongMatch()
    {
        try (RuleTester tester = defaultRuleTester()) {
            tester.assertThat(new DummyReplaceNodeRule())
                    .on(p ->
                            p.project(
                                    Assignments.of(p.symbol("y"), expression("x")),
                                    p.values(
                                            ImmutableList.of(p.symbol("x")),
                                            ImmutableList.of(ImmutableList.of(expression("1"))))))
                    .matches(
                            values(ImmutableList.of("different"), ImmutableList.of()));
        }
    }

    private static class DummyReplaceNodeRule
            implements Rule<PlanNode>
    {
        @Override
        public Pattern<PlanNode> getPattern()
        {
            return Pattern.typeOf(PlanNode.class);
        }

        @Override
        public Result apply(PlanNode node, Captures captures, Context context)
        {
            return Result.ofPlanNode(node.replaceChildren(node.getSources()));
        }
    }
}

@@ -735,16 +735,77 @@
 attern;%0A
+import io.prestosql.sql.planner.assertions.PlanMatchPattern;%0A
 import i
@@ -1229,174 +1229,114 @@
 er;%0A
-%0Apublic class TestRuleTester%0A%7B%0A    @Test(expectedExceptions = AssertionError.class, expectedExceptionsMessageRegExp = %22Plan does not match, expected .* but found .*%22)
+import static org.assertj.core.api.Assertions.assertThatThrownBy;%0A%0Apublic class TestRuleTester%0A%7B%0A    @Test
 %0A   
@@ -1444,16 +1444,40 @@
         
+ RuleAssert ruleAssert =
  tester.
@@ -1888,16 +1888,18 @@
 1%22))))))
+;%0A
 %0A       
@@ -1907,53 +1907,35 @@
     
-        .matches(%0A                           
+PlanMatchPattern expected =
  val
@@ -1988,16 +1988,232 @@
 st.of())
+;%0A            assertThatThrownBy(() -%3E ruleAssert.matches(expected))%0A                    .isInstanceOf(AssertionError.class)%0A                    .hasMessageMatching(%22(?s)Plan does not match, expected .* but found .*%22
 );%0A     

Replace @Test(expectedExceptions) with assertThatThrownBy