001/* 002 * Copyright (C) Christian Schulte, 2005-206 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without 006 * modification, are permitted provided that the following conditions 007 * are met: 008 * 009 * o Redistributions of source code must retain the above copyright 010 * notice, this list of conditions and the following disclaimer. 011 * 012 * o Redistributions in binary form must reproduce the above copyright 013 * notice, this list of conditions and the following disclaimer in 014 * the documentation and/or other materials provided with the 015 * distribution. 016 * 017 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 018 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 019 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 020 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, 021 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 022 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 023 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 024 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 025 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 026 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 027 * 028 * $JOMC: SectionEditorTest.java 4613 2012-09-22 10:07:08Z schulte $ 029 * 030 */ 031package org.jomc.util.test; 032 033import java.io.BufferedReader; 034import java.io.IOException; 035import java.io.InputStream; 036import java.io.StringReader; 037import org.apache.commons.io.IOUtils; 038import org.jomc.util.LineEditor; 039import org.jomc.util.Section; 040import org.jomc.util.SectionEditor; 041import org.junit.Test; 042import static org.junit.Assert.assertEquals; 043import static org.junit.Assert.assertFalse; 044import static org.junit.Assert.assertNotNull; 045import static org.junit.Assert.assertTrue; 046import static org.junit.Assert.fail; 047 048/** 049 * Test cases for class {@code org.jomc.util.SectionEditor}. 050 * 051 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 052 * @version $JOMC: SectionEditorTest.java 4613 2012-09-22 10:07:08Z schulte $ 053 */ 054public class SectionEditorTest extends LineEditorTest 055{ 056 057 /** Constant to prefix relative resource names with. */ 058 private static final String ABSOLUTE_RESOURCE_NAME_PREFIX = "/org/jomc/util/test/"; 059 060 /** Creates a new {@code SectionEditorTest} instance. */ 061 public SectionEditorTest() 062 { 063 super(); 064 } 065 066 /** {@inheritDoc} */ 067 @Override 068 public SectionEditor getLineEditor() 069 { 070 return (SectionEditor) super.getLineEditor(); 071 } 072 073 /** {@inheritDoc} */ 074 @Override 075 protected SectionEditor newLineEditor() 076 { 077 return new SectionEditor() 078 { 079 080 @Override 081 protected void editSection( final Section section ) throws IOException 082 { 083 super.editSection( section ); 084 085 if ( section.getName() != null ) 086 { 087 section.getHeadContent().append( section.getName() ).append( " Head" ). 088 append( this.getLineSeparator() ); 089 090 section.getTailContent().append( section.getName() ).append( " Tail" ). 091 append( this.getLineSeparator() ); 092 093 } 094 } 095 096 }; 097 } 098 099 /** {@inheritDoc} */ 100 @Override 101 protected SectionEditor newLineEditor( final LineEditor editor ) 102 { 103 return new SectionEditor( editor ); 104 } 105 106 @Test 107 public final void testSectionEditor() throws Exception 108 { 109 String test = this.getResource( ABSOLUTE_RESOURCE_NAME_PREFIX + "TestSections.txt" ); 110 String expected = 111 convertLineSeparator( this.getResource( ABSOLUTE_RESOURCE_NAME_PREFIX + "TestSectionsEdited.txt" ) ); 112 113 String edited = this.getLineEditor().edit( test ); 114 115 System.out.println( "TEST:" ); 116 System.out.println( test ); 117 System.out.println( "EXPECTED:" ); 118 System.out.println( expected ); 119 System.out.println( "EDITED:" ); 120 System.out.println( edited ); 121 122 assertEquals( expected, edited ); 123 assertTrue( this.getLineEditor().isSectionPresent( "1" ) ); 124 assertTrue( this.getLineEditor().isSectionPresent( "1.1" ) ); 125 assertTrue( this.getLineEditor().isSectionPresent( "1.1.1" ) ); 126 assertTrue( this.getLineEditor().isSectionPresent( "1.1.1.1" ) ); 127 assertTrue( this.getLineEditor().isSectionPresent( "1.2" ) ); 128 assertTrue( this.getLineEditor().isSectionPresent( "1.3" ) ); 129 assertTrue( this.getLineEditor().isSectionPresent( "1.4" ) ); 130 assertTrue( this.getLineEditor().isSectionPresent( "2" ) ); 131 assertTrue( this.getLineEditor().isSectionPresent( "3" ) ); 132 assertTrue( this.getLineEditor().isSectionPresent( "4" ) ); 133 assertTrue( this.getLineEditor().isSectionPresent( "5" ) ); 134 assertTrue( this.getLineEditor().isSectionPresent( "6" ) ); 135 assertTrue( this.getLineEditor().isSectionPresent( "7" ) ); 136 assertTrue( this.getLineEditor().isSectionPresent( "8" ) ); 137 assertTrue( this.getLineEditor().isSectionPresent( "9" ) ); 138 assertTrue( this.getLineEditor().isSectionPresent( "10" ) ); 139 140 test = this.getResource( ABSOLUTE_RESOURCE_NAME_PREFIX + "TestSectionsCont.txt" ); 141 expected = 142 convertLineSeparator( this.getResource( ABSOLUTE_RESOURCE_NAME_PREFIX + "TestSectionsContEdited.txt" ) ); 143 144 edited = this.getLineEditor().edit( test ); 145 146 System.out.println( "TEST:" ); 147 System.out.println( test ); 148 System.out.println( "EXPECTED:" ); 149 System.out.println( expected ); 150 System.out.println( "EDITED:" ); 151 System.out.println( edited ); 152 153 assertEquals( expected, edited ); 154 assertTrue( this.getLineEditor().isSectionPresent( "1" ) ); 155 assertTrue( this.getLineEditor().isSectionPresent( "1.1" ) ); 156 assertTrue( this.getLineEditor().isSectionPresent( "1.1.1" ) ); 157 assertTrue( this.getLineEditor().isSectionPresent( "2" ) ); 158 assertFalse( this.getLineEditor().isSectionPresent( "10" ) ); 159 160 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "UnmatchedSectionTest.txt" ); 161 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "UnmatchedSectionsTest.txt" ); 162 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "UnmatchedSubsectionTest.txt" ); 163 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "UnmatchedSubsectionsTest.txt" ); 164 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "MissingSectionStartTest.txt" ); 165 this.assertUnmatchedSections( ABSOLUTE_RESOURCE_NAME_PREFIX + "MissingSectionsStartTest.txt" ); 166 167 final StringBuilder testNoSections = new StringBuilder(); 168 final StringBuilder expectedNoSections = new StringBuilder(); 169 170 for ( int i = 1000; i >= 0; i-- ) 171 { 172 testNoSections.append( "Hello editor.\n" ); 173 expectedNoSections.append( "Hello editor." ).append( this.getLineEditor().getLineSeparator() ); 174 } 175 176 assertEquals( expectedNoSections.toString(), this.getLineEditor().edit( testNoSections.toString() ) ); 177 178 try 179 { 180 this.getLineEditor().edit( "SECTION-START[Test\nSECTION-END\n" ); 181 } 182 catch ( final IOException e ) 183 { 184 assertNotNull( e.getMessage() ); 185 System.out.println( e.toString() ); 186 } 187 } 188 189 private void assertUnmatchedSections( final String resourceName ) throws Exception 190 { 191 try 192 { 193 this.getLineEditor().edit( this.getResource( resourceName ) ); 194 fail( "Expected IOException not thrown for resource '" + resourceName + "'." ); 195 } 196 catch ( final IOException e ) 197 { 198 assertNotNull( e.getMessage() ); 199 System.out.println( e.toString() ); 200 } 201 } 202 203 private static String convertLineSeparator( final String s ) throws IOException 204 { 205 BufferedReader reader = null; 206 boolean suppressExceptionOnClose = true; 207 208 try 209 { 210 final StringBuilder b = new StringBuilder(); 211 reader = new BufferedReader( new StringReader( s ) ); 212 213 String line; 214 while ( ( line = reader.readLine() ) != null ) 215 { 216 b.append( line ).append( System.getProperty( "line.separator", "\n" ) ); 217 } 218 219 suppressExceptionOnClose = false; 220 return b.toString(); 221 } 222 finally 223 { 224 try 225 { 226 if ( reader != null ) 227 { 228 reader.close(); 229 } 230 } 231 catch ( final IOException e ) 232 { 233 if ( !suppressExceptionOnClose ) 234 { 235 throw e; 236 } 237 } 238 } 239 } 240 241 private String getResource( final String resourceName ) throws IOException 242 { 243 244 InputStream in = null; 245 boolean suppressExceptionOnClose = true; 246 assertTrue( resourceName.startsWith( "/" ) ); 247 248 try 249 { 250 in = this.getClass().getResourceAsStream( resourceName ); 251 assertNotNull( "Resource '" + resourceName + "' not found.", in ); 252 final String content = IOUtils.toString( in, this.getResourceEncoding() ); 253 suppressExceptionOnClose = false; 254 return content; 255 } 256 finally 257 { 258 try 259 { 260 if ( in != null ) 261 { 262 in.close(); 263 } 264 } 265 catch ( final IOException e ) 266 { 267 if ( !suppressExceptionOnClose ) 268 { 269 throw e; 270 } 271 } 272 } 273 } 274 275}