////////////////////////////////////////////////////////////////////////////////
// checkstyle: Checks Java source code for adherence to a set of rules.
// Copyright (C) 2001-2017 the original author or authors.
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////

package com.puppycrawl.tools.checkstyle;

import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.when;

import java.lang.reflect.Method;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import org.powermock.reflect.Whitebox;

import com.puppycrawl.tools.checkstyle.api.AuditEvent;
import com.puppycrawl.tools.checkstyle.api.LocalizedMessage;
import com.puppycrawl.tools.checkstyle.api.SeverityLevel;

@RunWith(PowerMockRunner.class)
@PrepareForTest(AuditEvent.class)
public class AuditEventDefaultFormatterTest {

    @Test
    public void testFormatFullyQualifiedModuleNameContainsCheckSuffix() {
        final LocalizedMessage message = new LocalizedMessage(1, 1, null, null, null,
                SeverityLevel.WARNING, null, TestModuleCheck.class, "Mocked message.");
        final AuditEvent event = new AuditEvent("", "InputMockFile.java", message);
        final AuditEventFormatter formatter = new AuditEventDefaultFormatter();

        final String expected = "[WARN] InputMockFile.java:1:1: Mocked message. "
                + "[AuditEventDefaultFormatterTest$TestModule]";

        assertEquals("Invalid format", expected, formatter.format(event));
    }

    @Test
    public void testFormatFullyQualifiedModuleNameDoesNotContainCheckSuffix() {
        final LocalizedMessage message = new LocalizedMessage(1, 1, null, null, null,
                SeverityLevel.WARNING, null, TestModule.class, "Mocked message.");
        final AuditEvent event = new AuditEvent("", "InputMockFile.java", message);
        final AuditEventFormatter formatter = new AuditEventDefaultFormatter();

        final String expected = "[WARN] InputMockFile.java:1:1: Mocked message. "
                + "[AuditEventDefaultFormatterTest$TestModule]";

        assertEquals("Invalid format", expected, formatter.format(event));
    }

    @Test
    public void testFormatModuleNameContainsCheckSuffix() {
        final AuditEvent mock = PowerMockito.mock(AuditEvent.class);
        when(mock.getSourceName()).thenReturn("TestModuleCheck");
        when(mock.getSeverityLevel()).thenReturn(SeverityLevel.WARNING);
        when(mock.getLine()).thenReturn(1);
        when(mock.getColumn()).thenReturn(1);
        when(mock.getMessage()).thenReturn("Mocked message.");
        when(mock.getFileName()).thenReturn("InputMockFile.java");
        final AuditEventFormatter formatter = new AuditEventDefaultFormatter();

        final String expected = "[WARN] InputMockFile.java:1:1: Mocked message. [TestModule]";

        assertEquals("Invalid format", expected, formatter.format(mock));
    }

    @Test
    public void testFormatModuleNameDoesNotContainCheckSuffix() {
        final AuditEvent mock = PowerMockito.mock(AuditEvent.class);
        when(mock.getSourceName()).thenReturn("TestModule");
        when(mock.getSeverityLevel()).thenReturn(SeverityLevel.WARNING);
        when(mock.getLine()).thenReturn(1);
        when(mock.getColumn()).thenReturn(1);
        when(mock.getMessage()).thenReturn("Mocked message.");
        when(mock.getFileName()).thenReturn("InputMockFile.java");
        final AuditEventFormatter formatter = new AuditEventDefaultFormatter();

        final String expected = "[WARN] InputMockFile.java:1:1: Mocked message. [TestModule]";

        assertEquals("Invalid format", expected, formatter.format(mock));
    }

    @Test
    public void testFormatModuleWithModuleId() {
        final LocalizedMessage message = new LocalizedMessage(1, 1, null, null, null,
                SeverityLevel.WARNING, "ModuleId", TestModule.class, "Mocked message.");
        final AuditEvent event = new AuditEvent("", "InputMockFile.java", message);
        final AuditEventFormatter formatter = new AuditEventDefaultFormatter();

        final String expected = "[WARN] InputMockFile.java:1:1: Mocked message. [ModuleId]";

        assertEquals("Invalid format", expected, formatter.format(event));
    }

    @Test
    public void testCalculateBufferLength() throws Exception {
        final Method calculateBufferLengthMethod =
                Whitebox.getMethod(AuditEventDefaultFormatter.class,
                        "calculateBufferLength", AuditEvent.class, int.class);
        final LocalizedMessage localizedMessage = new LocalizedMessage(1, 1,
                "messages.properties", "key", null, SeverityLevel.ERROR, null,
                getClass(), null);
        final AuditEvent auditEvent = new AuditEvent(new Object(), "fileName", localizedMessage);
        final int result = (int) calculateBufferLengthMethod.invoke(null,
                auditEvent, SeverityLevel.ERROR.ordinal());

        assertEquals("Buffer length is not expected", 54, result);
    }

    private static class TestModuleCheck {
        // no code
    }

    private static class TestModule {
        // no code
    }
}
