View Javadoc
1   /*
2    * Copyright (c) 2002-2025 Gargoyle Software Inc.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * https://www.apache.org/licenses/LICENSE-2.0
8    *
9    * Unless required by applicable law or agreed to in writing, software
10   * distributed under the License is distributed on an "AS IS" BASIS,
11   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   * See the License for the specific language governing permissions and
13   * limitations under the License.
14   */
15  package org.htmlunit.junit.annotation;
16  
17  import static org.junit.Assert.assertFalse;
18  
19  import java.lang.reflect.Method;
20  import java.util.Arrays;
21  
22  import org.htmlunit.BrowserVersion;
23  import org.htmlunit.junit.BrowserRunner;
24  import org.htmlunit.junit.BrowserVersionClassRunner;
25  
26  /**
27   * Utility functions for working with our annotations.
28   *
29   * @author Ahmed Ashour
30   * @author Ronald Brill
31   */
32  public final class AnnotationUtils {
33  
34      /**
35       * Disallow instantiation of this class.
36       */
37      private AnnotationUtils() {
38          // Empty.
39      }
40  
41      /**
42       * Helper to validate defined annotations for various errors.
43       *
44       * @param method the method to validate
45       */
46      public static void assertAlerts(final Method method) {
47          final Alerts alerts = method.getAnnotation(Alerts.class);
48          if (alerts != null) {
49              if (!BrowserVersionClassRunner.isDefined(alerts.value())) {
50                  assertFalse("Obsolete DEFAULT because all browser expectations defined individually",
51                          BrowserVersionClassRunner.isDefined(alerts.DEFAULT())
52                          && BrowserVersionClassRunner.isDefined(alerts.CHROME())
53                          && BrowserVersionClassRunner.isDefined(alerts.FF())
54                          && BrowserVersionClassRunner.isDefined(alerts.FF_ESR())
55                          && BrowserVersionClassRunner.isDefined(alerts.EDGE()));
56  
57                  assertNotEquals("@Alerts", method, BrowserVersion.CHROME, alerts.CHROME(), alerts.DEFAULT());
58                  assertNotEquals("@Alerts", method, BrowserVersion.FIREFOX, alerts.FF(), alerts.DEFAULT());
59                  assertNotEquals("@Alerts", method, BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), alerts.DEFAULT());
60                  assertNotEquals("@Alerts", method, BrowserVersion.EDGE, alerts.EDGE(), alerts.DEFAULT());
61              }
62  
63              final HtmlUnitNYI nyiAlerts = method.getAnnotation(HtmlUnitNYI.class);
64              if (nyiAlerts != null) {
65                  if (BrowserVersionClassRunner.isDefined(nyiAlerts.value())) {
66                      if (BrowserVersionClassRunner.isDefined(alerts.CHROME())) {
67                          assertNotEquals("@HtmlUnitNYI",
68                                  method, null, alerts.CHROME(), nyiAlerts.value());
69                      }
70                      else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
71                          assertNotEquals("@HtmlUnitNYI",
72                                  method, null, alerts.DEFAULT(), nyiAlerts.value());
73                      }
74                      else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
75                          assertNotEquals("@HtmlUnitNYI",
76                                  method, null, alerts.value(), nyiAlerts.value());
77                      }
78                  }
79  
80                  if (BrowserVersionClassRunner.isDefined(nyiAlerts.CHROME())) {
81                      if (BrowserVersionClassRunner.isDefined(alerts.CHROME())) {
82                          assertNotEquals("@HtmlUnitNYI",
83                                  method, BrowserVersion.CHROME, alerts.CHROME(), nyiAlerts.CHROME());
84                      }
85                      else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
86                          assertNotEquals("@HtmlUnitNYI",
87                                  method, BrowserVersion.CHROME, alerts.DEFAULT(), nyiAlerts.CHROME());
88                      }
89                      else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
90                          assertNotEquals("@HtmlUnitNYI",
91                                  method, BrowserVersion.CHROME, alerts.value(), nyiAlerts.CHROME());
92                      }
93                  }
94  
95                  if (BrowserVersionClassRunner.isDefined(nyiAlerts.FF_ESR())) {
96                      if (BrowserVersionClassRunner.isDefined(alerts.FF_ESR())) {
97                          assertNotEquals("@HtmlUnitNYI",
98                                  method, BrowserVersion.FIREFOX_ESR, alerts.FF_ESR(), nyiAlerts.FF_ESR());
99                      }
100                     else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
101                         assertNotEquals("@HtmlUnitNYI",
102                                 method, BrowserVersion.FIREFOX_ESR, alerts.DEFAULT(), nyiAlerts.FF_ESR());
103                     }
104                     else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
105                         assertNotEquals("@HtmlUnitNYI",
106                                 method, BrowserVersion.FIREFOX_ESR, alerts.value(), nyiAlerts.FF_ESR());
107                     }
108                 }
109 
110                 if (BrowserVersionClassRunner.isDefined(nyiAlerts.FF())) {
111                     if (BrowserVersionClassRunner.isDefined(alerts.FF())) {
112                         assertNotEquals("@HtmlUnitNYI",
113                                 method, BrowserVersion.FIREFOX, alerts.FF(), nyiAlerts.FF());
114                     }
115                     else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
116                         assertNotEquals("@HtmlUnitNYI",
117                                 method, BrowserVersion.FIREFOX, alerts.DEFAULT(), nyiAlerts.FF());
118                     }
119                     else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
120                         assertNotEquals("@HtmlUnitNYI",
121                                 method, BrowserVersion.FIREFOX, alerts.value(), nyiAlerts.FF());
122                     }
123                 }
124 
125                 if (BrowserVersionClassRunner.isDefined(nyiAlerts.EDGE())) {
126                     if (BrowserVersionClassRunner.isDefined(alerts.EDGE())) {
127                         assertNotEquals("@HtmlUnitNYI",
128                                 method, BrowserVersion.EDGE, alerts.EDGE(), nyiAlerts.EDGE());
129                     }
130                     else if (BrowserVersionClassRunner.isDefined(alerts.DEFAULT())) {
131                         assertNotEquals("@HtmlUnitNYI",
132                                 method, BrowserVersion.EDGE, alerts.DEFAULT(), nyiAlerts.EDGE());
133                     }
134                     else if (BrowserVersionClassRunner.isDefined(alerts.value())) {
135                         assertNotEquals("@HtmlUnitNYI",
136                                 method, BrowserVersion.EDGE, alerts.value(), nyiAlerts.EDGE());
137                     }
138                 }
139             }
140         }
141     }
142 
143     private static void assertNotEquals(final String annotation, final Method method, final BrowserVersion browser,
144             final String[] value1, final String[] value2) {
145         if (value1.length != 0 && !BrowserRunner.EMPTY_DEFAULT.equals(value1[0])
146                 && value1.length == value2.length
147                 && Arrays.asList(value1).toString().equals(Arrays.asList(value2).toString())) {
148             final String nickname = browser == null ? "DEFAULT" : browser.getNickname();
149             throw new AssertionError("Redundant " + annotation + " for " + nickname + " in "
150                     + method.getDeclaringClass().getSimpleName() + '.' + method.getName() + "()");
151         }
152     }
153 }