/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements. See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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 org.apache.logging.log4j.core.pattern;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.junit.Test;

import static org.junit.Assert.*;

/**
 *
 */
public class PatternParserTest2 {

    @Test
    public void testParseConvertBackslashes() {
        final boolean convert = true;
        final StringBuilder buf = new StringBuilder();
        final String pattern = "%d{HH-mm-ss} \\t ...";

        final Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 23);
        cal.set(Calendar.MINUTE, 53);
        cal.set(Calendar.SECOND, 01);
        parse(pattern, convert, buf, cal.getTime(), 123);

        assertEquals("23-53-01 \t ...", buf.toString());
    }

    @Test
    public void testParseDontConvertBackslashes() {
        final boolean convert = false;
        final StringBuilder buf = new StringBuilder();
        final String pattern = "%d{HH-mm-ss} \\t---";

        final Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 13);
        cal.set(Calendar.MINUTE, 24);
        cal.set(Calendar.SECOND, 59);
        parse(pattern, convert, buf, cal.getTime(), 3);

        assertEquals("13-24-59 \\t---", buf.toString());
    }

    private void parse(final String pattern, final boolean convert, final StringBuilder buf, final Date date, final int i) {
        final PatternParser parser0 = new PatternParser(null, "Converter", null);
        final List<PatternConverter> converters = new ArrayList<>();
        final List<FormattingInfo> fields = new ArrayList<>();
        parser0.parse(pattern, converters, fields, false, false, convert);
        final FormattingInfo[] infoArray = new FormattingInfo[fields.size()];
        final FormattingInfo[] patternFields = fields.toArray(infoArray);
        final ArrayPatternConverter[] converterArray = new ArrayPatternConverter[converters.size()];
        final ArrayPatternConverter[] patternConverters = converters.toArray(converterArray);
        formatFileName(patternConverters, patternFields, buf, date, i);
    }

    /**
     * Format file name.
     *
     * @param buf string buffer to which formatted file name is appended, may not be null.
     * @param objects objects to be evaluated in formatting, may not be null.
     */
    protected final void formatFileName(final ArrayPatternConverter[] patternConverters,
            final FormattingInfo[] patternFields, final StringBuilder buf, final Object... objects) {
        for (int i = 0; i < patternConverters.length; i++) {
            final int fieldStart = buf.length();
            patternConverters[i].format(buf, objects);

            if (patternFields[i] != null) {
                patternFields[i].format(fieldStart, buf);
            }
        }
    }
}
