// Path: src/main/java/tv/ustream/yolo/config/ConfigException.java
// public class ConfigException extends Exception
// {
// 
//     public ConfigException(final String message)
//     {
//         super("Configuration error: " + message);
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/parser/IParser.java
// public interface IParser extends IModule
// {
// 
//     Map<String, Object> parse(String line);
// 
//     boolean runAlways();
// 
//     List<String> getOutputKeys();
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/parser/PassThruParser.java
// public class PassThruParser implements IParser
// {
// 
//     @Override
//     public Map<String, Object> parse(final String line)
//     {
//         Map<String, Object> result = new HashMap<String, Object>();
//         result.put("line", line);
//         return result;
//     }
// 
//     @Override
//     public boolean runAlways()
//     {
//         return true;
//     }
// 
//     @Override
//     public List<String> getOutputKeys()
//     {
//         return Arrays.asList("line");
//     }
// 
//     @Override
//     public void setUpModule(final Map<String, Object> parameters)
//     {
//     }
// 
//     @Override
//     public ConfigMap getModuleConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public String getModuleDescription()
//     {
//         return "forwards all lines to processor (map: 'line' -> 'content'), runs always";
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/processor/ConsoleProcessor.java
// public class ConsoleProcessor implements IProcessor
// {
// 
//     @Override
//     public void process(final Map<String, Object> parserOutput, final Map<String, Object> processParams)
//     {
//         System.out.format("[console] Parser output: %s, process parameters: %s%n", parserOutput, processParams);
//     }
// 
//     @Override
//     public ConfigMap getProcessParamsConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public void setUpModule(final Map<String, Object> parameters)
//     {
//     }
// 
//     @Override
//     public ConfigMap getModuleConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public String getModuleDescription()
//     {
//         return "writes parameters to console, use it for debug purposes";
//     }
// 
//     @Override
//     public void stop()
//     {
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/processor/IProcessor.java
// public interface IProcessor extends IModule
// {
// 
//     ConfigMap getProcessParamsConfig();
// 
//     void process(Map<String, Object> parserOutput, Map<String, Object> processParams);
// 
//     void stop();
// 
// }


import java.util.HashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import tv.ustream.yolo.config.ConfigException;
import tv.ustream.yolo.module.parser.IParser;
import tv.ustream.yolo.module.parser.PassThruParser;
import tv.ustream.yolo.module.processor.ConsoleProcessor;
import tv.ustream.yolo.module.processor.IProcessor;
package tv.ustream.yolo.module;


/**
 * @author bandesz
 */
public class ModuleFactoryTest
{

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void createProcessorShouldCreateNewInstance() throws ConfigException
    {
        Map<String, Object> config = new HashMap<String, Object>();
        config.put("class", ConsoleProcessor.class.getCanonicalName());

        IProcessor processor = new ModuleFactory().createProcessor("x", config);

        Assert.assertEquals(ConsoleProcessor.class, processor.getClass());
    }

    @Test
    public void createProcessorShouldThrowExceptionWhenConfigIsInvalid() throws ConfigException
    {
        thrown.expect(ConfigException.class);

        Map<String, Object> config = new HashMap<String, Object>();

        IProcessor processor = new ModuleFactory().createProcessor("x", config);

// Path: src/main/java/tv/ustream/yolo/config/ConfigException.java
// public class ConfigException extends Exception
// {
// 
//     public ConfigException(final String message)
//     {
//         super("Configuration error: " + message);
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/parser/IParser.java
// public interface IParser extends IModule
// {
// 
//     Map<String, Object> parse(String line);
// 
//     boolean runAlways();
// 
//     List<String> getOutputKeys();
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/parser/PassThruParser.java
// public class PassThruParser implements IParser
// {
// 
//     @Override
//     public Map<String, Object> parse(final String line)
//     {
//         Map<String, Object> result = new HashMap<String, Object>();
//         result.put("line", line);
//         return result;
//     }
// 
//     @Override
//     public boolean runAlways()
//     {
//         return true;
//     }
// 
//     @Override
//     public List<String> getOutputKeys()
//     {
//         return Arrays.asList("line");
//     }
// 
//     @Override
//     public void setUpModule(final Map<String, Object> parameters)
//     {
//     }
// 
//     @Override
//     public ConfigMap getModuleConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public String getModuleDescription()
//     {
//         return "forwards all lines to processor (map: 'line' -> 'content'), runs always";
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/processor/ConsoleProcessor.java
// public class ConsoleProcessor implements IProcessor
// {
// 
//     @Override
//     public void process(final Map<String, Object> parserOutput, final Map<String, Object> processParams)
//     {
//         System.out.format("[console] Parser output: %s, process parameters: %s%n", parserOutput, processParams);
//     }
// 
//     @Override
//     public ConfigMap getProcessParamsConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public void setUpModule(final Map<String, Object> parameters)
//     {
//     }
// 
//     @Override
//     public ConfigMap getModuleConfig()
//     {
//         return null;
//     }
// 
//     @Override
//     public String getModuleDescription()
//     {
//         return "writes parameters to console, use it for debug purposes";
//     }
// 
//     @Override
//     public void stop()
//     {
//     }
// 
// }
// 
// Path: src/main/java/tv/ustream/yolo/module/processor/IProcessor.java
// public interface IProcessor extends IModule
// {
// 
//     ConfigMap getProcessParamsConfig();
// 
//     void process(Map<String, Object> parserOutput, Map<String, Object> processParams);
// 
//     void stop();
// 
// }


// Path: src/test/java/tv/ustream/yolo/module/ModuleFactoryTest.java
import java.util.HashMap;
import java.util.Map;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import tv.ustream.yolo.config.ConfigException;
import tv.ustream.yolo.module.parser.IParser;
import tv.ustream.yolo.module.parser.PassThruParser;
import tv.ustream.yolo.module.processor.ConsoleProcessor;
import tv.ustream.yolo.module.processor.IProcessor;

package tv.ustream.yolo.module;


/**
 * @author bandesz
 */
public class ModuleFactoryTest
{

    @Rule
    public ExpectedException thrown = ExpectedException.none();

    @Test
    public void createProcessorShouldCreateNewInstance() throws ConfigException
    {
        Map<String, Object> config = new HashMap<String, Object>();
        config.put("class", ConsoleProcessor.class.getCanonicalName());

        IProcessor processor = new ModuleFactory().createProcessor("x", config);

        Assert.assertEquals(ConsoleProcessor.class, processor.getClass());
    }

    @Test
    public void createProcessorShouldThrowExceptionWhenConfigIsInvalid() throws ConfigException
    {
        thrown.expect(ConfigException.class);

        Map<String, Object> config = new HashMap<String, Object>();

        IProcessor processor = new ModuleFactory().createProcessor("x", config);

        Assert.assertEquals(ConsoleProcessor.class, processor.getClass());