
/*
 * 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.
 */

import java.io.*;
import java.util.*;
import java.util.jar.*;
import org.codehaus.plexus.util.*;

boolean result = true;

try
{
    File report = new File( basedir, "target/announcement/test-announce.vm" );
    if ( !report.exists() || report.isDirectory() )
    {
        System.err.println( "report file is missing or a directory." );
        return false;
    }
    String reportContent = FileUtils.fileRead( report );

    int indexOf = reportContent.indexOf( "maven-changes-plugin-test-1.1 release" );
    if ( indexOf < 0 )
    {
      System.err.println( "test-announce.vm doesn't contain 'maven-changes-plugin-test-1.1 release'" );
      return false;
    }

    indexOf = reportContent.indexOf( "Test Announcement Custom template" );
    if ( indexOf < 0 )
    {
      System.err.println( "Test Announcement Custom template" );
      return false;
    }
    
    indexOf = reportContent.indexOf( "$date.systemDate" );
    if ( indexOf >= 0 )
    {
      System.err.println( "$date.systemDate not resolved" );
      return false;
    }
    

}
catch( Throwable e )
{
    e.printStackTrace();
    result = false;
}

return result;
