#
# Copyright 2006-2013 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.
#
# 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.
#
# 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.
#
# 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.SerializableNoConstructor                          = No constructor (serializable)
org.objenesis.tck.candidates.SerializableDefaultPublicConstructor               = Default public constructor (serializable)
org.objenesis.tck.candidates.SerializableDefaultProtectedConstructor            = Default protected constructor (serializable)
org.objenesis.tck.candidates.SerializableDefaultPackageConstructor              = Default package constructor (serializable)
org.objenesis.tck.candidates.SerializableDefaultPrivateConstructor              = Default private constructor (serializable)
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.SerializableConstructorThrowingException           = Constructor throwing exception (serializable)
org.objenesis.tck.candidates.SerializableConstructorWithArguments               = Constructor with arguments (serializable)
org.objenesis.tck.candidates.SerializableConstructorWithMandatoryArguments      = Constructor with mandatory arguments (serializable)
