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

// Test uses a selector containing a name which is invalid for JMS and is therefore rejected by the Java Broker
qpid_tests.broker_1_0.selector.SelectorTests.test_special_fields

// Qpid Broker-J currently fails to select messages matching JMSDestination = 'a'
qpid_tests.broker_1_0.selector.SelectorTests.test_jms_header_names

// Qpid Broker-J currently rejects the transfer. Don't think x-amqp-to is implemented.
qpid_tests.broker_1_0.general.GeneralTests.test_anonymous_relay


// Following translation tests currently fail (not investigated further)
qpid_tests.broker_1_0.translation.TranslationTests.test_translate_list_1
qpid_tests.broker_1_0.translation.TranslationTests.test_translate_list_2
qpid_tests.broker_1_0.translation.TranslationTests.test_translate_map_1
qpid_tests.broker_1_0.translation.TranslationTests.test_translate_map_2
qpid_tests.broker_1_0.legacy_exchanges.LegacyExchangeTests.test_direct
qpid_tests.broker_1_0.legacy_exchanges.LegacyExchangeTests.test_headers
qpid_tests.broker_1_0.legacy_exchanges.LegacyExchangeTests.test_topic
