These files show the behavior of an animation for different framesPerSecond values set, especially edge cases.
The animated prim has time samples from 0 to 100:
double3 xformOp:translate.timeSamples = { 0: (0, 0, 0), 100: (100, 0, 0), }
framesPerSecond = -1 : framesPerSecond_-1.usdaframesPerSecond = 0 : framesPerSecond_0.usdaframesPerSecond = 1 : framesPerSecond_1.usdaframesPerSecond = 24 : framesPerSecond_24.usdaframesPerSecond = 48 : framesPerSecond_48.usdaframesPerSecond = 100 : framesPerSecond_100.usdaframesPerSecond = 101 : framesPerSecond_101.usdaframesPerSecond = 128 : framesPerSecond_128.usda#usda 1.0
(
    customLayerData = {
        string copyright = "Copyright 2022 Apple Inc. All rights reserved."
    }
    endTimeCode = 100
    framesPerSecond = 1
    startTimeCode = 0
    metersPerUnit = 0.01
    subLayers = [
        @../../../_common/animated_cube_translation.usda@,
        @../../../_common/axis.usda@
    ]
    upAxis = "Y"
    defaultPrim = "World"
)