@@ -54,10 +54,22 @@ LLViewerFetchedTexture* LLViewerTextureManager::getFetchedTexture(const LLUUID&,
5454 LLGLint, LLGLenum, LLHost ) { return NULL ; }
5555
5656// Stub related map calls
57+
58+ // Records each sendMapBlockRequest call for inspection in tests
59+ struct MapBlockRequest
60+ {
61+ U16 min_x, min_y, max_x, max_y;
62+ };
63+ static std::vector<MapBlockRequest> gMapBlockRequests ;
64+
5765LLWorldMapMessage::LLWorldMapMessage () { }
5866LLWorldMapMessage::~LLWorldMapMessage () { }
5967void LLWorldMapMessage::sendItemRequest (U32 type, U64 handle) { }
60- void LLWorldMapMessage::sendMapBlockRequest (U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent) { }
68+ void LLWorldMapMessage::sendMapBlockRequest (U16 min_x, U16 min_y, U16 max_x, U16 max_y, bool return_nonexistent)
69+ {
70+ MapBlockRequest req = { min_x, min_y, max_x, max_y };
71+ gMapBlockRequests .push_back (req);
72+ }
6173
6274LLWorldMipmap::LLWorldMipmap () { }
6375LLWorldMipmap::~LLWorldMipmap () { }
@@ -518,4 +530,63 @@ namespace tut
518530 mWorld ->cancelTracking ();
519531 ensure (" LLWorldMap::cancelTracking() at end test failed" , mWorld ->isTracking () == false );
520532 }
533+ // Test updateRegions() request grouping, size limits, and bounds
534+ template <> template <>
535+ void worldmap_object_t ::test<4 >()
536+ {
537+ // Test 27 : 1x1 block (4x4 = 16 regions) - single small request within bounds
538+ mWorld ->reset ();
539+ gMapBlockRequests .clear ();
540+ mWorld ->updateRegions (0 , 0 , 3 , 3 );
541+ ensure (" updateRegions 1x1 block: expected 1 request" , gMapBlockRequests .size () == 1 );
542+ {
543+ const MapBlockRequest& req = gMapBlockRequests [0 ];
544+ ensure (" updateRegions 1x1 block: min_x" , req.min_x == 0 );
545+ ensure (" updateRegions 1x1 block: min_y" , req.min_y == 0 );
546+ ensure (" updateRegions 1x1 block: max_x" , req.max_x == 3 );
547+ ensure (" updateRegions 1x1 block: max_y" , req.max_y == 3 );
548+ S32 regions = (req.max_x - req.min_x + 1 ) * (req.max_y - req.min_y + 1 );
549+ ensure (" updateRegions 1x1 block: must not exceed 64 regions" , regions <= 64 );
550+ }
551+
552+ // Test 28 : 2x2 blocks (8x8 = 64 regions) - single request at the 64-region limit
553+ mWorld ->reset ();
554+ gMapBlockRequests .clear ();
555+ mWorld ->updateRegions (0 , 0 , 7 , 7 );
556+ ensure (" updateRegions 2x2 blocks: expected 1 request" , gMapBlockRequests .size () == 1 );
557+ {
558+ const MapBlockRequest& req = gMapBlockRequests [0 ];
559+ ensure (" updateRegions 2x2 blocks: min_x" , req.min_x == 0 );
560+ ensure (" updateRegions 2x2 blocks: min_y" , req.min_y == 0 );
561+ ensure (" updateRegions 2x2 blocks: max_x" , req.max_x == 7 );
562+ ensure (" updateRegions 2x2 blocks: max_y" , req.max_y == 7 );
563+ S32 regions = (req.max_x - req.min_x + 1 ) * (req.max_y - req.min_y + 1 );
564+ ensure (" updateRegions 2x2 blocks: must not exceed 64 regions" , regions <= 64 );
565+ }
566+
567+ // Test 29 : 4x4 blocks (16x16 = 256 total regions) - must split into multiple requests
568+ // each spanning a 4x1 strip (64 regions), none exceeding the server limit
569+ mWorld ->reset ();
570+ gMapBlockRequests .clear ();
571+ mWorld ->updateRegions (0 , 0 , 15 , 15 );
572+ ensure (" updateRegions 4x4 blocks: expected 4 requests" , gMapBlockRequests .size () == 4 );
573+ for (size_t i = 0 ; i < gMapBlockRequests .size (); ++i)
574+ {
575+ const MapBlockRequest& req = gMapBlockRequests [i];
576+ S32 regions = (req.max_x - req.min_x + 1 ) * (req.max_y - req.min_y + 1 );
577+ ensure (" updateRegions 4x4 blocks: each request must not exceed 64 regions" , regions <= 64 );
578+ // Requests must stay within the requested area (0..15)
579+ ensure (" updateRegions 4x4 blocks: max_x in bounds" , req.max_x <= 15 );
580+ ensure (" updateRegions 4x4 blocks: max_y in bounds" , req.max_y <= 15 );
581+ }
582+ // Each request covers one horizontal strip of 4 blocks (rows 0..3, 4..7, 8..11, 12..15)
583+ ensure (" updateRegions 4x4 blocks: request[0] min_y" , gMapBlockRequests [0 ].min_y == 0 );
584+ ensure (" updateRegions 4x4 blocks: request[0] max_y" , gMapBlockRequests [0 ].max_y == 3 );
585+ ensure (" updateRegions 4x4 blocks: request[1] min_y" , gMapBlockRequests [1 ].min_y == 4 );
586+ ensure (" updateRegions 4x4 blocks: request[1] max_y" , gMapBlockRequests [1 ].max_y == 7 );
587+ ensure (" updateRegions 4x4 blocks: request[2] min_y" , gMapBlockRequests [2 ].min_y == 8 );
588+ ensure (" updateRegions 4x4 blocks: request[2] max_y" , gMapBlockRequests [2 ].max_y == 11 );
589+ ensure (" updateRegions 4x4 blocks: request[3] min_y" , gMapBlockRequests [3 ].min_y == 12 );
590+ ensure (" updateRegions 4x4 blocks: request[3] max_y" , gMapBlockRequests [3 ].max_y == 15 );
591+ }
521592}
0 commit comments