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

dist_TESTS = runner.sh

CLEANFILES = runner.beam test.ini

EXTRA_DIST = \
    couch_config_test.erl \
    couch_config_writer_test.erl \
    etap/030-doc-from-json.t \
    etap/080-config-get-set.t \
    etap/064-kt-counting.t \
    etap/081-config-override.1.ini \
    etap/100-ref-counter.t \
    etap/083-config-no-files.t \
    etap/070-couch-db.t \
    etap/010-file-basics.t \
    etap/060-kt-merging.t \
    etap/040-util.t \
    etap/110-replication-httpc.t \
    etap/062-kt-remove-leaves.t \
    etap/001-load.t \
    etap/111-replication-changes-feed.t \
    etap/063-kt-get-leaves.t \
    etap/090-task-status.t \
    etap/021-btree-reductions.t \
    etap/081-config-override.2.ini \
    etap/065-kt-stemming.t \
    etap/020-btree-basics.t \
    etap/081-config-override.t \
    etap/082-config-register.t \
    etap/112-replication-missing-revs.t \
    etap/011-file-headers.t \
    etap/061-kt-missing-leaves.t \
    etap/050-stream.t \
    etap/031-doc-to-json.t \
    query_server_spec.rb \
    run_native_process.es \
    runner.erl \
    runner.sh \
    test.js
