Add LocationRange struct

This commit is contained in:
Michael Miller 2024-06-11 20:06:04 -06:00
parent 05e924da70
commit 675d385cbf
No known key found for this signature in database
GPG key ID: 32B47AE8F388A1FF
2 changed files with 107 additions and 0 deletions

View file

@ -0,0 +1,67 @@
require "../../spec_helper"
describe Spectator::Core::LocationRange do
describe "#includes?" do
it "returns true if the location is in the range" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("foo", 15)
range.includes?(location).should be_true
end
it "returns false if the location is not in the range" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("bar", 30)
range.includes?(location).should be_false
end
it "returns true if the files are the same and the location line is omitted" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("foo")
range.includes?(location).should be_true
end
it "returns false if the files are different" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("bar", 15)
range.includes?(location).should be_false
end
end
describe "#===" do
it "returns true if the location is in the range" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("foo", 15)
(range === location).should be_true
end
it "returns false if the location is not in the range" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("bar", 30)
(range === location).should be_false
end
it "returns true if the files are the same and the location line is omitted" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("foo")
(range === location).should be_true
end
it "returns false if the files are different" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
location = Spectator::Core::Location.new("bar", 15)
(range === location).should be_false
end
end
describe "#to_s" do
it "returns a string representation" do
range = Spectator::Core::LocationRange.new("foo", 10, 20)
range.to_s.should eq("foo:10-20")
end
it "returns a string representation with no end line" do
range = Spectator::Core::LocationRange.new("foo", 10)
range.to_s.should eq("foo:10")
end
end
end

View file

@ -0,0 +1,40 @@
module Spectator::Core
# Information about a range in the source code.
struct LocationRange
# Name of the source file.
getter file : String
# Starting line number in the source file.
getter line : Int32
# Ending line number in the source file.
getter end_line : Int32
# Creates a new location range.
def initialize(@file, @line, @end_line)
end
# Creates a new location range with the same start and end line.
def initialize(@file, @line)
@end_line = @line
end
# Checks if the location is in the range.
def includes?(location : Location)
return false if location.file != @file
return true unless (line = location.line?)
@line <= line && line <= @end_line
end
# Constructs a string representation of the location range.
def to_s(io : IO) : Nil
io << @file << ':' << @line
io << '-' << @end_line if @end_line != @line
end
# Returns true if the location is in the range.
def ===(other : Location)
includes?(other)
end
end
end