Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'curses'
- require 'test/unit'
- class Gravity
- attr_accessor :gravity
- None = 0
- Center = 1
- Top = 2
- Left = 3
- Right = 4
- Bottom = 5
- TopLeft = 6
- TopRight = 7
- BottomLeft = 8
- BottomRight = 9
- def initialize(gravity = Gravity::None)
- @gravity = gravity
- end
- def to_s
- case @gravity
- when None
- return "NoneGravity"
- when Center
- return "CenterGravity"
- when Top
- return "TopGravity"
- when Left
- return "LeftGravity"
- when Right
- return "RightGravity"
- when Bottom
- return "BottomGravity"
- when TopLeft
- return "TopLeftGravity"
- when TopRight
- return "TopRightGravity"
- when BottomLeft
- return "BottomLeftGravity"
- when BottomRight
- return "BottomRightGravity"
- end
- end
- def ==(other)
- @gravity == other.gravity
- end
- end
- class Border
- attr_accessor :left, :right, :top, :bottom, :titlebar_height
- def initialize(left, right, top, bottom, titlebar_height)
- @left = left
- @right = right
- @top = top
- @bottom = bottom
- @titlebar_height = titlebar_height
- end
- def width
- left + right
- end
- def height
- top + titlebar_height + bottom
- end
- end
- class Size
- attr_accessor :width
- attr_accessor :height
- def initialize(width, height)
- @width = width
- @height = height
- end
- end
- class Point
- attr_accessor :x
- attr_accessor :y
- def initialize(x, y)
- @x = x
- @y = y
- end
- end
- def gravity(size, border, point)
- return Gravity.new(Gravity::None) if point.x >= size.width or point.y >= size.height
- if point.x < border.left
- return Gravity.new(Gravity::TopLeft) if point.y < border.top + 10
- return Gravity.new(Gravity::BottomLeft) if point.y >= size.height - border.left - 10
- return Gravity.new(Gravity::Left)
- end
- if point.x >= (size.width - border.right) - 10
- return Gravity.new(Gravity::TopRight) if point.y < border.top
- return Gravity.new(Gravity::BottomRight) if point.y >= size.height - border.bottom
- end
- if point.x >= size.width - border.left
- return Gravity.new(Gravity::TopRight) if point.y < border.top + 10
- return Gravity.new(Gravity::BottomRight) if point.y >= size.height - border.left - 10
- return Gravity.new(Gravity::Right)
- end
- if point.x < border.left + 10
- return Gravity.new(Gravity::TopLeft) if point.y < border.top
- return Gravity.new(Gravity::BottomLeft) if point.y >= size.height - border.bottom
- end
- return Gravity.new(Gravity::Top) if point.y < border.top
- return Gravity.new(Gravity::Bottom) if point.y >= size.height - border.bottom
- return Gravity.new(Gravity::Center)
- end
- def draw
- Curses::init_screen
- Curses::nl
- Curses::noecho
- @border = Border.new(2, 2, 2, 2, 10)
- @size = Size.new(30, 30)
- 0.upto(@size.width - 1) do |x|
- 0.upto(@size.height - 1) do |y|
- Curses::setpos(y, x)
- if gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::Center)
- Curses::addstr " "
- elsif gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::TopLeft) or
- gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::TopRight) or
- gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::BottomLeft) or
- gravity(@size, @border, Point.new(x, y)) == Gravity.new(Gravity::BottomRight)
- Curses::addstr "+"
- else
- Curses::addstr "-"
- end
- end
- end
- Curses::refresh
- Curses::getch
- Curses::close_screen
- end
- draw
- exit
- class TestGravity < Test::Unit::TestCase
- def setup
- @border = Border.new(2, 2, 2, 2, 10)
- @size = Size.new(30, 30)
- end
- def test_edges
- assert gravity(@size, @border, Point.new(0, 0)) == Gravity.new(Gravity::TopLeft)
- assert gravity(@size, @border, Point.new(@size.width - 1, 0)) == Gravity.new(Gravity::TopRight)
- assert gravity(@size, @border, Point.new(0, @size.height - 1)) == Gravity.new(Gravity::BottomLeft)
- assert gravity(@size, @border, Point.new(@size.width - 1, @size.height - 1)) == Gravity.new(Gravity::BottomRight)
- end
- def test_sides
- (10 + @border.top).upto(@size.height - 10 - @border.bottom - 1) do |y|
- assert gravity(@size, @border, Point.new(0, y)) == Gravity.new(Gravity::Left)
- end
- (10 + @border.top).upto(@size.height - 10 - @border.bottom - 1) do |y|
- assert gravity(@size, @border, Point.new(@size.width - 1, y)) == Gravity.new(Gravity::Right)
- end
- (@border.left + 10).upto(@size.width - 10 - @border.right - 1) do |x|
- assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::Top)
- end
- (@border.left + 10).upto(@size.width - 10 - @border.right - 1) do |x|
- assert gravity(@size, @border, Point.new(x, @size.height - 1)) == Gravity.new(Gravity::Bottom)
- end
- end
- def test_topleft
- 0.upto(@border.left + 10 - 1) do |x|
- assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::TopLeft)
- end
- 0.upto(@border.top + 10 - 1) do |y|
- assert gravity(@size, @border, Point.new(0, y)) == Gravity.new(Gravity::TopLeft)
- end
- end
- def test_topright
- (@size.width - 10 - @border.right).upto(@size.width - 1) do |x|
- assert gravity(@size, @border, Point.new(x, 0)) == Gravity.new(Gravity::TopRight)
- end
- 0.upto(@border.top + 10 - 1) do |y|
- assert gravity(@size, @border, Point.new(@size.width - 1, y)) == Gravity.new(Gravity::TopRight)
- end
- end
- end
Add Comment
Please, Sign In to add comment