#
# Copyright 2006-2017 the original author or authors.
#
# 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.
#

# List of candidate classes to attempt to instantiate in the Objenesis TCK.

# Different visibilities of constructor.
org.objenesis.tck.candidates.NoConstructor                                      = No constructor
org.objenesis.tck.candidates.SerializableNoConstructor                          = No constructor (serializable)
org.objenesis.tck.candidates.DefaultPublicConstructor                           = Default public constructor
org.objenesis.tck.candidates.SerializableDefaultPublicConstructor               = Default public constructor (serializable)
org.objenesis.tck.candidates.DefaultProtectedConstructor                        = Default protected constructor
org.objenesis.tck.candidates.SerializableDefaultProtectedConstructor            = Default protected constructor (serializable)
org.objenesis.tck.candidates.DefaultPackageConstructor                          = Default package constructor
org.objenesis.tck.candidates.SerializableDefaultPackageConstructor              = Default package constructor (serializable)
org.objenesis.tck.candidates.DefaultPrivateConstructor                          = Default private constructor
org.objenesis.tck.candidates.SerializableDefaultPrivateConstructor              = Default private constructor (serializable)
org.objenesis.tck.candidates.SerializableWithAncestorThrowingException          = Serializable with ancestor throwing exception
org.objenesis.tck.candidates.SerializableReplacer                               = Serializable replacing with another class
org.objenesis.tck.candidates.SerializableResolver                               = Serializable resolving to another class

# Constructors that work with arguments passed in.
org.objenesis.tck.candidates.ConstructorThrowingException                       = Constructor throwing exception
org.objenesis.tck.candidates.SerializableConstructorThrowingException           = Constructor throwing exception (serializable)
org.objenesis.tck.candidates.ConstructorWithArguments                           = Constructor with arguments
org.objenesis.tck.candidates.SerializableConstructorWithArguments               = Constructor with arguments (serializable)
org.objenesis.tck.candidates.ConstructorWithMandatoryArguments                  = Constructor with mandatory arguments
org.objenesis.tck.candidates.SerializableConstructorWithMandatoryArguments      = Constructor with mandatory arguments (serializable)
