/*
 * Copyright (c) 2007 Mockito contributors
 * This program is made available under the terms of the MIT License.
 */
package org.mockito.exceptions.base;

import static org.assertj.core.api.Assertions.assertThat;

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class TraceBuilder {

    private String[] methods = {};
    private String[] classes = {};

    public Throwable toThrowable() {
        RuntimeException exception = new RuntimeException();
        exception.setStackTrace(toTraceArray());
        return exception;
    }

    private List<StackTraceElement> toTraceList() {
        assertThat(methods.length == 0 || classes.length == 0).isTrue();

        List<StackTraceElement> trace = new LinkedList<StackTraceElement>();
        for (String method : methods) {
            trace.add(new StackTraceElement("SomeClass", method, "SomeClass.java", 50));
        }
        for (String clazz : classes) {
            trace.add(new StackTraceElement(clazz, "someMethod", clazz + ".java", 50));
        }

        Collections.reverse(trace);
        return trace;
    }

    public StackTraceElement[] toTraceArray() {
        return toTraceList().toArray(new StackTraceElement[0]);
    }

    public TraceBuilder classes(String... classes) {
        this.classes = classes;
        return this;
    }

    public TraceBuilder methods(String... methods) {
        this.methods = methods;
        return this;
    }
}
