/** * Copyright (C) 2014-2017 Philip Helger (www.helger.com) * philip[at]helger[dot]com * * Licensed 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 com.helger.css.reader; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.io.File; import java.nio.charset.Charset; import javax.annotation.Nonnull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.helger.commons.io.file.filter.IFileFilter; import com.helger.commons.io.file.iterate.FileSystemRecursiveIterator; import com.helger.commons.mock.CommonsTestHelper; import com.helger.css.decl.CascadingStyleSheet; import com.helger.css.reader.errorhandler.CollectingCSSParseErrorHandler; import com.helger.css.reader.errorhandler.LoggingCSSParseErrorHandler; import com.helger.css.writer.CSSWriter; import com.helger.css.writer.CSSWriterSettings; /** * Abstract class for reading multiple CSS files * * @author Philip Helger */ public abstract class AbstractFuncTestCSSReader { protected final Logger m_aLogger = LoggerFactory.getLogger (getClass ()); private final boolean m_bDebug; private final CSSReaderSettings m_aReaderSettings; private final CSSWriterSettings m_aWriterSettings; protected AbstractFuncTestCSSReader (@Nonnull final Charset aCharset, final boolean bDebug, final boolean bBrowserCompliantMode) { m_bDebug = bDebug; m_aReaderSettings = new CSSReaderSettings ().setFallbackCharset (aCharset) .setBrowserCompliantMode (bBrowserCompliantMode); m_aWriterSettings = new CSSWriterSettings (); if (m_bDebug) m_aLogger.info ("Running test in " + (bBrowserCompliantMode ? "browser compliant mode" : "strict mode")); } protected final boolean isBrowserCompliantMode () { return m_aReaderSettings.isBrowserCompliantMode (); } protected final void testReadGood (@Nonnull final String sBaseDir) { final File aBaseDir = new File (sBaseDir); if (!aBaseDir.exists ()) throw new IllegalArgumentException ("BaseDir " + sBaseDir + " does not exist!"); for (final File aFile : new FileSystemRecursiveIterator (aBaseDir).withFilter (IFileFilter.filenameEndsWith (".css"))) { final String sKey = aFile.getAbsolutePath (); if (m_bDebug) m_aLogger.info ("Filename: " + sKey); final CollectingCSSParseErrorHandler aErrorHdl = new CollectingCSSParseErrorHandler (); m_aReaderSettings.setCustomErrorHandler (aErrorHdl.and (new LoggingCSSParseErrorHandler ())); final CascadingStyleSheet aCSS = CSSReader.readFromFile (aFile, m_aReaderSettings); assertNotNull (sKey, aCSS); // May have errors or not if (m_bDebug) m_aLogger.info ("Parse errors: " + aErrorHdl.getAllParseErrors ().toString ()); CommonsTestHelper.testDefaultSerialization (aCSS); // Write optimized version and compare it String sCSS = new CSSWriter (m_aWriterSettings.setOptimizedOutput (true)).getCSSAsString (aCSS); assertNotNull (sKey, sCSS); if (m_bDebug) m_aLogger.info ("Created CSS: " + sCSS); final CascadingStyleSheet aCSSReRead = CSSReader.readFromStringReader (sCSS, m_aReaderSettings); assertNotNull ("Failed to parse " + sKey + ":\n" + sCSS, aCSSReRead); assertEquals (sKey + "\n" + sCSS, aCSS, aCSSReRead); // Write non-optimized version and compare it sCSS = new CSSWriter (m_aWriterSettings.setOptimizedOutput (false)).getCSSAsString (aCSS); assertNotNull (sKey, sCSS); if (m_bDebug) m_aLogger.info ("Read and re-created CSS: " + sCSS); assertEquals (sKey, aCSS, CSSReader.readFromStringReader (sCSS, m_aReaderSettings)); // Write non-optimized and code-removed version and ensure it is not // null sCSS = new CSSWriter (m_aWriterSettings.setOptimizedOutput (false) .setRemoveUnnecessaryCode (true)).getCSSAsString (aCSS); assertNotNull (sKey, sCSS); assertNotNull (sKey, CSSReader.readFromStringReader (sCSS, m_aReaderSettings)); // Restore value :) m_aWriterSettings.setRemoveUnnecessaryCode (false); } } protected final void testReadBad (@Nonnull final String sBaseDir) { final File aBaseDir = new File (sBaseDir); if (!aBaseDir.exists ()) throw new IllegalArgumentException ("BaseDir " + sBaseDir + " does not exist!"); for (final File aFile : new FileSystemRecursiveIterator (aBaseDir).withFilter (IFileFilter.filenameEndsWith (".css"))) { final String sKey = aFile.getAbsolutePath (); if (m_bDebug) m_aLogger.info (sKey); // Handle each error as a fatal error! final CascadingStyleSheet aCSS = CSSReader.readFromFile (aFile, m_aReaderSettings); assertNull (sKey, aCSS); } } protected final void testReadBadButRecoverable (@Nonnull final String sBaseDir) { final File aBaseDir = new File (sBaseDir); if (!aBaseDir.exists ()) throw new IllegalArgumentException ("BaseDir " + sBaseDir + " does not exist!"); for (final File aFile : new FileSystemRecursiveIterator (aBaseDir).withFilter (IFileFilter.filenameEndsWith (".css"))) { final String sKey = aFile.getAbsolutePath (); if (m_bDebug) m_aLogger.info (sKey); // Handle each error as a fatal error! final CollectingCSSParseErrorHandler aErrorHdl = new CollectingCSSParseErrorHandler (); m_aReaderSettings.setCustomErrorHandler (aErrorHdl.and (new LoggingCSSParseErrorHandler ())); final CascadingStyleSheet aCSS = CSSReader.readFromFile (aFile, m_aReaderSettings); assertNotNull (sKey, aCSS); assertTrue (sKey, aErrorHdl.hasParseErrors ()); assertTrue (sKey, aErrorHdl.getParseErrorCount () > 0); if (m_bDebug) m_aLogger.info (aErrorHdl.getAllParseErrors ().toString ()); // Write optimized version and re-read it final String sCSS = new CSSWriter (m_aWriterSettings.setOptimizedOutput (true)).getCSSAsString (aCSS); assertNotNull (sKey, sCSS); if (m_bDebug) m_aLogger.info (sCSS); final CascadingStyleSheet aCSSReRead = CSSReader.readFromStringReader (sCSS, m_aReaderSettings); assertNotNull ("Failed to parse:\n" + sCSS, aCSSReRead); assertEquals (sKey, aCSS, aCSSReRead); } } protected final void testReadBadButBrowserCompliant (@Nonnull final String sBaseDir) { if (m_aReaderSettings.isBrowserCompliantMode ()) testReadGood (sBaseDir); else testReadBad (sBaseDir); } protected final void testReadBadButRecoverableAndBrowserCompliant (@Nonnull final String sBaseDir) { if (m_aReaderSettings.isBrowserCompliantMode ()) testReadGood (sBaseDir); else testReadBadButRecoverable (sBaseDir); } }