1+ # Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
2+ #
3+ # Licensed under the Apache License, Version 2.0 (the "License");
4+ # you may not use this file except in compliance with the License.
5+ # You may obtain a copy of the License at
6+ #
7+ # http://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+ """Tests for process_stop_token_ids in fastdeploy.input.utils.common."""
16+
17+ from fastdeploy .input .utils .common import process_stop_token_ids
18+
19+
20+ def _mock_update_stop_seq_fn (stop_sequences ):
21+ """Mock update_stop_seq that simulates tokenization and padding.
22+
23+ Simulates: "```" -> [101], "end" -> [201, 202]
24+ Returns padded sequences and actual lengths.
25+ """
26+ token_map = {
27+ "```" : [101 ],
28+ "end" : [201 , 202 ],
29+ "\n \n " : [301 , 302 , 303 ],
30+ "stop" : [401 ],
31+ }
32+ seqs = [token_map .get (s , [999 ]) for s in stop_sequences ]
33+ actual_lens = [len (s ) for s in seqs ]
34+ # Simulate pad_batch_data: pad to max length with -1
35+ max_len = max (len (s ) for s in seqs ) if seqs else 0
36+ padded = [s + [- 1 ] * (max_len - len (s )) for s in seqs ]
37+ return padded , actual_lens
38+
39+
40+ def test_stop_token_ids_list_int ():
41+ """stop_token_ids as List[int] should produce length-1 sequences."""
42+ request = {"stop_token_ids" : [100 , 200 , 300 ]}
43+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
44+
45+ assert request ["stop_token_ids" ] == [[100 ], [200 ], [300 ]]
46+ assert request ["stop_seqs_len" ] == [1 , 1 , 1 ]
47+
48+
49+ def test_stop_token_ids_list_list_int ():
50+ """stop_token_ids as List[List[int]] should preserve actual lengths."""
51+ request = {"stop_token_ids" : [[10 , 20 ], [30 ]]}
52+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
53+
54+ assert request ["stop_token_ids" ] == [[10 , 20 ], [30 ]]
55+ assert request ["stop_seqs_len" ] == [2 , 1 ]
56+
57+
58+ def test_stop_strings_uses_actual_lengths ():
59+ """stop strings with different tokenized lengths should use actual lengths, not padded."""
60+ request = {"stop" : ["```" , "end" ]}
61+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
62+
63+ # "```" -> [101, -1] (padded), actual len 1
64+ # "end" -> [201, 202], actual len 2
65+ assert request ["stop_token_ids" ] == [[101 , - 1 ], [201 , 202 ]]
66+ assert request ["stop_seqs_len" ] == [1 , 2 ]
67+
68+
69+ def test_mixed_stop_token_ids_and_stop_strings ():
70+ """Both stop_token_ids and stop strings should have correct lengths."""
71+ request = {
72+ "stop_token_ids" : [100 ],
73+ "stop" : ["```" , "\n \n " ],
74+ }
75+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
76+
77+ # stop_token_ids: [100] -> [[100]], len [1]
78+ # "```" -> [101, -1, -1] (padded to 3), actual len 1
79+ # "\n\n" -> [301, 302, 303], actual len 3
80+ assert request ["stop_token_ids" ] == [[100 ], [101 , - 1 , - 1 ], [301 , 302 , 303 ]]
81+ assert request ["stop_seqs_len" ] == [1 , 1 , 3 ]
82+
83+
84+ def test_empty_request ():
85+ """No stop tokens or strings should leave request unchanged."""
86+ request = {}
87+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
88+
89+ assert "stop_token_ids" not in request
90+ assert "stop_seqs_len" not in request
91+
92+
93+ def test_stop_token_ids_none ():
94+ """stop_token_ids=None should be treated as absent."""
95+ request = {"stop_token_ids" : None , "stop" : ["stop" ]}
96+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
97+
98+ assert request ["stop_token_ids" ] == [[401 ]]
99+ assert request ["stop_seqs_len" ] == [1 ]
100+
101+
102+ def test_stop_token_ids_empty_list ():
103+ """stop_token_ids=[] should be treated as absent."""
104+ request = {"stop_token_ids" : []}
105+ process_stop_token_ids (request , _mock_update_stop_seq_fn )
106+
107+ assert "stop_seqs_len" not in request
108+
109+
110+ if __name__ == "__main__" :
111+ test_stop_token_ids_list_int ()
112+ test_stop_token_ids_list_list_int ()
113+ test_stop_strings_uses_actual_lengths ()
114+ test_mixed_stop_token_ids_and_stop_strings ()
115+ test_empty_request ()
116+ test_stop_token_ids_none ()
117+ test_stop_token_ids_empty_list ()
118+ print ("All tests passed." )
0 commit comments