from typing import Optional
 
 from .frames import frame_for_id
-from .server import capability, request
+from .server import capability, request, client_bool_capability
 from .startup import send_gdb_with_response, in_gdb_thread
 from .varref import find_variable, VariableReference
 
 # Note that we ignore the 'filter' field.  That seems to be
 # specific to javascript.
 def variables(*, variablesReference: int, start: int = 0, count: int = 0, **args):
+    # This behavior was clarified here:
+    # https://github.com/microsoft/debug-adapter-protocol/pull/394
+    if not client_bool_capability("supportsVariablePaging"):
+        start = 0
+        count = 0
     result = send_gdb_with_response(
         lambda: _variables(variablesReference, start, count)
     )
 
 gdb_assert {[dict get $reg_scope namedVariables] > 0} "at least one register"
 
 set num [dict get $scope variablesReference]
-set refs [lindex [dap_check_request_and_response "fetch variables" \
-                     "variables" \
-                     [format {o variablesReference [i %d] count [i 3]} \
-                          $num]] \
-             0]
-
-foreach var [dict get $refs body variables] {
+# Send two requests and combine them, to verify that using a range
+# works.
+set refs1 [lindex [dap_check_request_and_response "fetch variables 0,1" \
+                      "variables" \
+                      [format {o variablesReference [i %d] count [i 2]} \
+                           $num]] \
+              0]
+set refs2 [lindex [dap_check_request_and_response "fetch variables 2" \
+                      "variables" \
+                      [format {o variablesReference [i %d] \
+                                   start [i 2] count [i 1]} \
+                           $num]] \
+              0]
+
+set vars [concat [dict get $refs1 body variables] \
+             [dict get $refs2 body variables]]
+foreach var $vars {
     set name [dict get $var name]
 
     if {$name != "dei"} {
 
     }
     return [dap_check_request_and_response $name initialize \
                {o clientID [s "gdb testsuite"] \
-                    supportsVariableType [l true]}]
+                    supportsVariableType [l true] \
+                    supportsVariablePaging [l true]}]
 }
 
 # Start gdb, send a DAP initialize request, and then a launch request