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

# a testcase for module "mnemonic-core" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurablePersonNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-core" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurablePersonRefBreakNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-core" that requires 'pmalloc' memory service to pass
mvn -Dtest=NonVolatileMemAllocatorNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-core" that requires 'vmem' memory service to pass
mvn -Dtest=VolatileMemAllocatorNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-core" that requires 'pmdk_vmem' memory service to pass
mvn -Dtest=PMDKVolatileMemAllocatorNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-core" that requires 'vmem memory service to pass
mvn -Dtest=MemClusteringNGTest test -pl mnemonic-core -DskipTests=false

mvn -Dtest=ChunkBufferNGTest test -pl mnemonic-core -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableSinglyLinkedListNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableSinglyLinkedListWithParamHolderNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurablePersonNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableHashMapNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableHashSetNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableArrayNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-collection" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableTreeNGTest  test -pl mnemonic-collections -DskipTests=false

# a testcase for module "mnemonic-computing-services/mnemonic-utilities-service" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableSinglyLinkedListNGPrintTest test -pl mnemonic-computing-services/mnemonic-utilities-service -DskipTests=false

# a testcase for module "mnemonic-computing-services/mnemonic-utilities-service" that requires 'pmalloc' memory service to pass
mvn -Dtest=DurableSinglyLinkedListNGSortTest test -pl mnemonic-computing-services/mnemonic-utilities-service -DskipTests=false

# a testcase for module "mnemonic-hadoop/mnemonic-hadoop-mapreduce" that requires 'pmalloc' memory service to pass
mvn -Dtest=MneMapreducePersonDataTest test -pl mnemonic-hadoop/mnemonic-hadoop-mapreduce -DskipTests=false

mvn -Dtest=MneMapreduceLongDataTest test -pl mnemonic-hadoop/mnemonic-hadoop-mapreduce -DskipTests=false

mvn -Dtest=MneMapreduceBufferDataTest test -pl mnemonic-hadoop/mnemonic-hadoop-mapreduce -DskipTests=false

mvn -Dtest=MneMapreduceChunkDataTest test -pl mnemonic-hadoop/mnemonic-hadoop-mapreduce -DskipTests=false

# a testcase for module "mnemonic-hadoop/mnemonic-hadoop-mapreduce" that requires 'pmalloc' memory service to pass
mvn -Dtest=MneMapredBufferDataTest test -pl mnemonic-hadoop/mnemonic-hadoop-mapreduce -DskipTests=false

# a testcase for module "mnemonic-spark/mnemonic-spark-core" that requires 'pmalloc' memory service to pass
mvn -Dsuites=org.apache.mnemonic.spark.rdd.DurableRDDLongDataSpec test -pl mnemonic-spark/mnemonic-spark-core -DskipTests=false

mvn -Dsuites=org.apache.mnemonic.spark.rdd.DurableRDDChunkDataSpec test -pl mnemonic-spark/mnemonic-spark-core -DskipTests=false

mvn -Dsuites=org.apache.mnemonic.spark.rdd.DurableRDDPersonDataSpec test -pl mnemonic-spark/mnemonic-spark-core -DskipTests=false

mvn -Dsuites=org.apache.mnemonic.spark.rdd.DurableRDDBufferDataSpec test -pl mnemonic-spark/mnemonic-spark-core -DskipTests=false

mvn -Dsuites=org.apache.mnemonic.spark.DurableBufferIODataSpec test -pl mnemonic-spark/mnemonic-spark-core -DskipTests=false

# a testcase for module "mnemonic-memory-services"
mvn -Dtest=JavaVMemServiceImplNGTest test -pl mnemonic-memory-services/mnemonic-java-vmem-service -DskipTests=false
