#   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.
configuration.loaded = true

packages = packagea

include = include.properties

#
# Other test properties
#

test.equals = value=one

test.empty=

#
# Test a property that uses a previous property
#
base=base
base.reference=${base}extra

#
# Non String Properties
#

test.boolean       = true
test.boolean.array = false
test.boolean.array = true

test.byte       = 10
test.byte.array = 20
test.byte.array = 30

test.double       = 10.25
test.double.array = 20.35
test.double.array = 30.45

test.float       = 20.25
test.float.array = 30.35
test.float.array = 40.45

test.integer       = 10
test.integer.array = 20
test.integer.array = 30

test.long       = 1000000
test.long.array = 2000000
test.long.array = 3000000

test.short       = 1
test.short.array = 2
test.short.array = 3

test.overwrite       = 1