/*
 * 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 com.facebook.presto.sql.planner.assertions;

import com.facebook.presto.Session;
import com.facebook.presto.cost.CostCalculator;
import com.facebook.presto.metadata.Metadata;
import com.facebook.presto.sql.planner.Plan;
import com.facebook.presto.sql.planner.iterative.Lookup;

import static com.facebook.presto.sql.planner.planPrinter.PlanPrinter.textLogicalPlan;
import static java.lang.String.format;

public final class PlanAssert
{
    private PlanAssert() {}

    public static void assertPlan(Session session, Metadata metadata, CostCalculator costCalculator, Plan actual, PlanMatchPattern pattern)
    {
        assertPlan(session, metadata, costCalculator, actual, Lookup.noLookup(), pattern);
    }

    public static void assertPlan(Session session, Metadata metadata, CostCalculator costCalculator, Plan actual, Lookup lookup, PlanMatchPattern pattern)
    {
        MatchResult matches = actual.getRoot().accept(new PlanMatchingVisitor(session, metadata, actual.getPlanNodeCosts(), lookup), pattern);
        if (!matches.isMatch()) {
            String logicalPlan = textLogicalPlan(actual.getRoot(), actual.getTypes(), metadata, costCalculator, session);
            throw new AssertionError(format("Plan does not match, expected [\n\n%s\n] but found [\n\n%s\n]", pattern, logicalPlan));
        }
    }
}

@@ -840,16 +840,156 @@
 Lookup;%0A
+import com.facebook.presto.sql.planner.plan.PlanNode;%0A%0Aimport static com.facebook.presto.sql.planner.iterative.Plans.resolveGroupReferences;
 %0Aimport 
@@ -1770,23 +1770,25 @@
  String 
-logical
+formatted
 Plan = t
@@ -1871,24 +1871,238 @@
 , session);%0A
+            PlanNode resolvedPlan = resolveGroupReferences(actual.getRoot(), lookup);%0A            String resolvedFormattedPlan = textLogicalPlan(resolvedPlan, actual.getTypes(), metadata, costCalculator, session);%0A
             
@@ -2133,16 +2133,37 @@
 (format(
+%0A                    
 %22Plan do
@@ -2220,27 +2220,141 @@
 s%5Cn%5D
-%22, pattern, logical
+ which resolves to %5B%5Cn%5Cn%25s%5Cn%5D%22,%0A                    pattern,%0A                    formattedPlan,%0A                    resolvedFormatted
 Plan

Print plan with GroupReferences resolved when rule test fails