#   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
propertyInOrder = test.properties

include = include.properties

include.file = include-interpol.properties
include = ${include.file}

test.unescape = This \n string \t contains \" escaped \\ character\u0073
test.unescape.list-separator = This string contains \, an escaped list separator

#
# Other test properties
#

test.equals = value=one

test.empty =
test.empty2

test.mixed.array = a
test.mixed.array = b, c, d
test.other.delimiter = a^b^c

test.multilines = This is a value spread out across several adjacent \
                  natural lines by escaping the line terminator with \
                  a backslash character.

#
# Test a property that uses a previous property
#

base = base
base.reference = ${base}extra
base.reference.array = ${base}extra
base.reference.array = ${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

#
# Test complex line ending escaping
#

test.path = C:\\path1\\
test.path = C:\\path2\\
test.path = C:\\path3\\\
complex\\test\\

#
# Test for the comment lines
#

#comment = this is not a property but a comment line starting with '#'
!comment = this is not a property but a comment line starting with '!'

#
# Tests for the key/value separators ('=', ':' or white space, escaped or not)
#

test.separator\=in.key = foo
test.separator\:in.key = bar
test.separator\	in.key = foo
test.separator\in.key = bar
test.separator\ in.key = foo

test.separator.equal = foo
test.separator.colon : foo
test.separator.tab	foo
test.separator.formfeedfoo
test.separator.whitespace foo
test.separator.no.space=foo

# Tests for backslash escaping in lists
test.share1 = \\\\\\\\share1a, \\\\\\\\share1b
test.share2 = \\\\share2a
test.share2 = \\\\share2b
test.share3 = \\\\\\\\share3a\\\\\\\\,\\\\\\\\share3b\\

# This is a foot comment

