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

plugins {
  id "java"
}

description = 'Ethereum Virtual Machine implementation'

dependencies {
  implementation project(':bytes')
  implementation project(':concurrent')
  implementation project(':crypto')
  implementation project(':concurrent-coroutines')
  implementation project(':eth')
  implementation project(':eth-precompiles')
  implementation project(':eth-repository')
  implementation project(':genesis')
  implementation project(':merkle-trie')
  implementation project(':rlp')
  implementation project(':units')
  implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core'
  implementation 'org.apache.lucene:lucene-core'
  implementation 'org.jetbrains.kotlin:kotlin-stdlib'
  implementation 'org.slf4j:slf4j-api'
  implementation 'io.vertx:vertx-core'

  testImplementation project(':io')
  testImplementation project(':merkle-trie')
  testImplementation project(':junit')
  testImplementation project(':kv')
  testImplementation 'io.opentelemetry:opentelemetry-api'
  testImplementation 'io.opentelemetry:opentelemetry-api-metrics'
  testImplementation 'io.opentelemetry:opentelemetry-sdk-metrics'
  testImplementation 'org.bouncycastle:bcprov-jdk15on'
  testImplementation 'org.junit.jupiter:junit-jupiter-api'
  testImplementation 'org.junit.jupiter:junit-jupiter-params'
  testImplementation 'com.fasterxml.jackson.core:jackson-databind'
  testImplementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'

  testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
  testRuntimeOnly 'ch.qos.logback:logback-classic'
}

def test = tasks.named("test") {
  useJUnitPlatform {
    excludeTags "referenceTest"
  }
}

tasks.register("referenceTest", Test) {
  description = 'Runs reference tests.'
  group = 'verification'
  shouldRunAfter test
}

def referenceTest = tasks.named("referenceTest") {
  useJUnitPlatform {
    includeTags "referenceTest"
  }
}
