<?xml version="1.0" encoding="UTF-8"?>

<!--
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.
-->

<project>
  <modelVersion>4.0.0</modelVersion>

  <parent>
    <groupId>org.apache.maven.its.mng4464</groupId>
    <artifactId>parent</artifactId>
    <version>0.1</version>
    <relativePath>../parent</relativePath>
  </parent>

  <groupId>org.apache.maven.its.mng4464</groupId>
  <artifactId>sub</artifactId>
  <version>0.1</version>
  <packaging>pom</packaging>

  <name>Maven Integration Test :: MNG-4464 :: Sub</name>
  <description>
    Test that Maven recognizes both the forward and the backward slash as file separators, regardless of the
    underlying filesystem (i.e. even on Unix).
  </description>

  <build>
    <!-- NOTE: The paths deliberately uses the backward slash -->
    <sourceDirectory>src\main\j</sourceDirectory>
    <testSourceDirectory>src\test\j</testSourceDirectory>
    <directory>target\it</directory>
    <outputDirectory>target\it\classes</outputDirectory>
    <testOutputDirectory>target\it\test-classes</testOutputDirectory>
    <resources>
      <resource>
        <directory>src\main\res</directory>
      </resource>
    </resources>
    <testResources>
      <testResource>
        <directory>src\test\res</directory>
      </testResource>
    </testResources>

    <plugins>
      <plugin>
        <groupId>org.apache.maven.its.plugins</groupId>
        <artifactId>maven-it-plugin-expression</artifactId>
        <version>2.1-SNAPSHOT</version>
        <executions>
          <execution>
            <phase>validate</phase>
            <goals>
              <goal>eval</goal>
            </goals>
            <configuration>
              <!-- NOTE: This deliberately uses the backward slash -->
              <outputFile>target\path.properties</outputFile>
              <expressions>
                <expression>project/build/sourceDirectory</expression>
                <expression>project/build/testSourceDirectory</expression>
                <expression>project/build/directory</expression>
                <expression>project/build/outputDirectory</expression>
                <expression>project/build/testOutputDirectory</expression>
                <expression>project/build/resources/0/directory</expression>
                <expression>project/build/testResources/0/directory</expression>
              </expressions>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>
