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

noinst_SCRIPTS = run
noinst_DATA = test_util.beam

%.beam: %.erl
	$(ERLC) $<

run: run.tpl
	sed -e "s|%abs_top_srcdir%|@abs_top_srcdir@|g" \
	    -e "s|%abs_top_builddir%|@abs_top_builddir@|g" > \
	$@ < $<
	chmod +x $@

CLEANFILES = run *.beam
DISTCLEANFILES = temp.*

EXTRA_DIST = \
	run.tpl \
    001-load.t \
    002-icu-driver.t \
    010-file-basics.t \
    011-file-headers.t \
    020-btree-basics.t \
    021-btree-reductions.t \
    030-doc-from-json.t \
    031-doc-to-json.t \
    040-util.t \
    041-uuid-gen-seq.ini \
    041-uuid-gen-utc.ini \
    041-uuid-gen.t \
    050-stream.t \
    060-kt-merging.t \
    061-kt-missing-leaves.t \
    062-kt-remove-leaves.t \
    063-kt-get-leaves.t \
    064-kt-counting.t \
    065-kt-stemming.t \
    070-couch-db.t \
    080-config-get-set.t \
    081-config-override.1.ini \
    081-config-override.2.ini \
    081-config-override.t \
    082-config-register.t \
    083-config-no-files.t \
    090-task-status.t \
    100-ref-counter.t \
    110-replication-httpc.t \
    111-replication-changes-feed.t \
    112-replication-missing-revs.t \
    113-replication-attachment-comp.t \
    120-stats-collect.t \
    121-stats-aggregates.cfg \
    121-stats-aggregates.ini \
    121-stats-aggregates.t \
    130-attachments-md5.t \
    140-attachment-comp.t \
    150-invalid-view-seq.t \
    160-vhosts.t
