package com.nobigsoftware.dfalex;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.nio.charset.Charset;
import java.util.ArrayDeque;
import java.util.HashSet;

import org.junit.Assert;

public class TestBase
{
    final PrettyPrinter m_printer = new PrettyPrinter();

    int _countStates(DfaState<?>... starts)
    {
        ArrayDeque<DfaState<?>> togo = new ArrayDeque<>();
        HashSet<DfaState<?>> checkSet = new HashSet<>();
        for (DfaState<?> start : starts)
        {
            if (checkSet.add(start))
            {
                togo.add(start);
            }
        }
        while(!togo.isEmpty())
        {
            DfaState<?> scanst = togo.removeFirst();
            scanst.enumerateTransitions((c1,c2,newstate)->{
                if (checkSet.add(newstate))
                {
                    togo.add(newstate);
                }
            });
        }
        return checkSet.size();
    }
    
    void _checkDfa(DfaState<?> start, String resource, boolean doStdout) throws Exception
    {
        String have;
        {
            StringWriter w = new StringWriter();
            m_printer.print(new PrintWriter(w), start);
            have = w.toString();
        }
        if (doStdout)
        {
            System.out.print(have);
            System.out.flush();
        }
        String want = _readResource(resource);
        Assert.assertEquals(want, have);
    }
    
    String _readResource(String resource) throws Exception
    {
        String pkg = getClass().getPackage().getName().replace('.', '/');
        InputStream instream = getClass().getClassLoader().getResourceAsStream(pkg+"/"+resource);
        try
        {
            InputStreamReader inreader = new InputStreamReader(instream, Charset.forName("UTF-8"));
            StringBuilder sb = new StringBuilder();
            char[] buf = new char[1024];
            for(;;)
            {
                int rlen = inreader.read(buf);
                if (rlen <= 0)
                {
                    break;
                }
                sb.append(buf, 0, rlen);
            }
            return sb.toString();
        }
        finally
        {
            instream.close();
        }
    }
}