1c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin/*
2c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * Copyright (C) 2016 The Android Open Source Project
3c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *
4c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
5c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * you may not use this file except in compliance with the License.
6c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * You may obtain a copy of the License at
7c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *
8c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *      http://www.apache.org/licenses/LICENSE-2.0
9c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *
10c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * Unless required by applicable law or agreed to in writing, software
11c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
12c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * See the License for the specific language governing permissions and
14c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * limitations under the License.
15c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin */
16c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinpackage android.icu.cts.coverage.rules;
17c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin
18c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinimport android.icu.util.ULocale;
19c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinimport org.junit.rules.MethodRule;
20c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinimport org.junit.runners.model.FrameworkMethod;
21c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinimport org.junit.runners.model.Statement;
22c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin
23c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin/**
24c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * Add this as a rule to a JUnit 4 class to support switching the {@link ULocale#getDefault()} for
25c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * the duration of the test method.
26c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *
27c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * <p>Only affects test methods that are annotated with {@link ULocaleDefault}.
28c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin *
29c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin * @see ULocaleDefault
30c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin */
31c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin@SuppressWarnings("deprecation")
32c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffinpublic class ULocaleDefaultRule implements MethodRule {
33c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin
34c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin    @Override
35c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin    public Statement apply(final Statement base, FrameworkMethod method, Object target) {
36c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin        final ULocaleDefault annotation = method.getAnnotation(ULocaleDefault.class);
37c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin        if (annotation == null) {
38c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin            return base;
39c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin        } else {
40c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin            return new Statement() {
41c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                @Override
42c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                public void evaluate() throws Throwable {
43c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                    ULocale previousDefault = ULocale.getDefault();
44c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                    try {
45c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                        ULocale.setDefault(ULocale.forLanguageTag(annotation.languageTag()));
46c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                        base.evaluate();
47c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                    } finally {
48c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                        ULocale.setDefault(previousDefault);
49c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                    }
50c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin                }
51c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin            };
52c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin        }
53c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin    }
54c92a5d28a28bee7a4d55423e0a2a48ea3c6fc007Paul Duffin}
55