View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.juneau;
18  
19  import static org.apache.juneau.commons.utils.CollectionUtils.*;
20  import static org.junit.jupiter.api.Assertions.*;
21  
22  import java.util.*;
23  
24  import org.apache.http.*;
25  import org.apache.http.message.*;
26  import org.junit.jupiter.api.*;
27  
28  /**
29   * Tests for {@link MediaRange} fluent setter overrides.
30   */
31  class MediaRange_Test extends TestBase {
32  
33  	@Test void a01_basic() {
34  		// Test basic MediaRange creation
35  		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("text/html;charset=UTF-8;q=0.9", null);
36  
37  		var x = new MediaRange(element);
38  
39  		assertEquals("text", x.getType());
40  		assertEquals("html", x.getSubType());
41  		assertEquals(0.9f, x.getQValue(), 0.01f);
42  	}
43  
44  	@Test void a02_forEachParameter_fluentChaining() {
45  		// Test that forEachParameter returns MediaRange for fluent chaining
46  		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("text/html;charset=UTF-8;level=1", null);
47  
48  		var x = new MediaRange(element);
49  
50  		// Test fluent chaining
51  		List<String> names = list();
52  		MediaRange result = x.forEachParameter(p -> names.add(p.getName()));
53  
54  		// Verify it returns MediaRange (not MediaType)
55  		assertSame(x, result);
56  		assertInstanceOf(MediaRange.class, result);
57  
58  		// Verify parameters were processed
59  		assertTrue(names.contains("charset"));
60  		assertTrue(names.contains("level"));
61  	}
62  
63  	@Test void a03_forEachParameter_withConsumer() {
64  		// Test that forEachParameter properly iterates parameters
65  		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("application/json;charset=UTF-8;version=2", null);
66  
67  		var x = new MediaRange(element);
68  
69  		// Collect all parameter values
70  		var params = new HashMap<String, String>();
71  		x.forEachParameter(p -> params.put(p.getName(), p.getValue()));
72  
73  		assertEquals("UTF-8", params.get("charset"));
74  		assertEquals("2", params.get("version"));
75  	}
76  
77  	@Test void a04_forEachParameter_emptyParameters() {
78  		// Test with no parameters
79  		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("text/plain", null);
80  
81  		var x = new MediaRange(element);
82  
83  		// Should not throw exception with empty parameters
84  		int[] count = {0};
85  		MediaRange result = x.forEachParameter(p -> count[0]++);
86  
87  		assertSame(x, result);
88  		assertEquals(0, count[0]);
89  	}
90  
91  	@Test void a05_fluentChaining_combined() {
92  		// Test chaining forEachParameter multiple times
93  		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("text/html;charset=UTF-8;level=1", null);
94  
95  		var x = new MediaRange(element);
96  
97  		// Chain multiple calls
98  		List<String> names1 = list();
99  		List<String> names2 = list();
100 
101 		x.forEachParameter(p -> names1.add(p.getName()))
102 		 .forEachParameter(p -> names2.add(p.getName()));
103 
104 		// Both should have captured the same parameters
105 		assertEquals(names1.size(), names2.size());
106 		assertTrue(names1.contains("charset"));
107 		assertTrue(names2.contains("charset"));
108 	}
109 
110 	@Test void a06_forEachParameter_withExtensions() {
111 		// Test that both forEachParameter and forEachExtension APIs work
112 		HeaderElement element = BasicHeaderValueParser.parseHeaderElement("text/html;q=0.9", null);
113 
114 		var x = new MediaRange(element);
115 
116 		// Test that forEachParameter can be called (returns MediaRange)
117 		MediaRange result = x.forEachParameter(p -> {});
118 		assertSame(x, result);
119 		assertInstanceOf(MediaRange.class, result);
120 
121 		// Test that forEachExtension also works
122 		result = x.forEachExtension(e -> {});
123 		assertSame(x, result);
124 		assertInstanceOf(MediaRange.class, result);
125 	}
126 }