| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312 | 
							- Layout = require '../../src/Layout'
 
- {object} = require 'utila'
 
- {open, get, conf} = do ->
 
-   show = (layout) ->
 
-     got = layout.get()
 
-     got = got.replace /<[^>]+>/g, ''
 
-   defaultBlockConfig =
 
-     linePrependor: options: amount: 2
 
-   c = (add = {}) ->
 
-     object.append defaultBlockConfig, add
 
-   ret = {}
 
-   ret.open = (block, name, top = 0, bottom = 0) ->
 
-     config = c
 
-       blockPrependor: options: amount: top
 
-       blockAppendor: options: amount: bottom
 
-     b = block.openBlock config, name
 
-     b.write name + ' | top ' + top + ' bottom ' + bottom
 
-     b
 
-   ret.get = (layout) ->
 
-     layout.get().replace(/<[^>]+>/g, '')
 
-   ret.conf = (props) ->
 
-     config = {}
 
-     if props.left?
 
-       object.appendOnto config, linePrependor: options: amount: props.left
 
-     if props.right?
 
-       object.appendOnto config, lineAppendor:  options: amount: props.right
 
-     if props.top?
 
-       object.appendOnto config, blockPrependor: options: amount: props.top
 
-     if props.bottom?
 
-       object.appendOnto config, blockAppendor:  options: amount: props.bottom
 
-     if props.width?
 
-       object.appendOnto config, width: props.width
 
-     if props.bullet is yes
 
-       object.appendOnto config, linePrependor: options: bullet: {char: '-', alignment: 'left'}
 
-     config
 
-   ret
 
- describe "Layout", ->
 
-   describe "inline inputs", ->
 
-     it "should be merged", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       l.write 'b'
 
-       get(l).should.equal 'ab'
 
-     it "should be correctly wrapped", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20
 
-       block.write '123456789012345678901234567890'
 
-       block.close()
 
-       get(l).should.equal '12345678901234567890\n1234567890'
 
-     it "should trim from left when wrapping to a new line", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20
 
-       block.write '12345678901234567890 \t 123456789012345678901'
 
-       block.close()
 
-       get(l).should.equal '12345678901234567890\n12345678901234567890\n1'
 
-     it "should handle line breaks correctly", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20
 
-       block.write '\na\n\nb\n'
 
-       block.close()
 
-       get(l).should.equal '\na\n\nb\n'
 
-     it "should not put extra line breaks when a line is already broken", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20
 
-       block.write '01234567890123456789\n0123456789'
 
-       block.close()
 
-       get(l).should.equal '01234567890123456789\n0123456789'
 
-   describe "horizontal margins", ->
 
-     it "should account for left margins", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20, left: 2
 
-       block.write '01'
 
-       block.close()
 
-       get(l).should.equal '  01'
 
-     it "should account for right margins", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20, right: 2
 
-       block.write '01'
 
-       block.close()
 
-       get(l).should.equal '01  '
 
-     it "should account for both margins", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20, right: 2, left: 1
 
-       block.write '01'
 
-       block.close()
 
-       get(l).should.equal ' 01  '
 
-     it "should break lines according to left margins", ->
 
-       l = new Layout
 
-       global.tick = yes
 
-       block = l.openBlock conf width: 20, left: 2
 
-       block.write '01234567890123456789'
 
-       block.close()
 
-       global.tick = no
 
-       get(l).should.equal '  01234567890123456789'
 
-     it "should break lines according to right margins", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20, right: 2
 
-       block.write '01234567890123456789'
 
-       block.close()
 
-       get(l).should.equal '01234567890123456789  '
 
-     it "should break lines according to both margins", ->
 
-       l = new Layout
 
-       block = l.openBlock conf width: 20, right: 2, left: 1
 
-       block.write '01234567890123456789'
 
-       block.close()
 
-       get(l).should.equal ' 01234567890123456789  '
 
-     it "should break lines according to terminal width", ->
 
-       l = new Layout terminalWidth: 20
 
-       block = l.openBlock conf right: 2, left: 1
 
-       block.write '01234567890123456789'
 
-       block.close()
 
-       # Note: We don't expect ' 01234567890123456  \n 789  ',
 
-       # since the first line (' 01234567890123456  ') is a full line
 
-       # according to layout.config.terminalWidth and doesn't need
 
-       # a break line.
 
-       get(l).should.equal ' 01234567890123456   789  '
 
-   describe "lines and blocks", ->
 
-     it "should put one break line between: line, block", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       l.openBlock().write('b').close()
 
-       get(l).should.equal 'a\nb'
 
-     it "should put one break line between: block, line", ->
 
-       l = new Layout
 
-       l.openBlock().write('a').close()
 
-       l.write 'b'
 
-       get(l).should.equal 'a\nb'
 
-     it "should put one break line between: line, block, line", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       l.openBlock().write('b').close()
 
-       l.write 'c'
 
-       get(l).should.equal 'a\nb\nc'
 
-     it "margin top should work for: line, block", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       l.openBlock(conf top: 2).write('b').close()
 
-       get(l).should.equal 'a\n\n\nb'
 
-     it "margin top should work for: block, line", ->
 
-       l = new Layout
 
-       l.openBlock(conf top: 1).write('a').close()
 
-       l.write 'b'
 
-       get(l).should.equal '\na\nb'
 
-     it "margin top should work for: block, line, when block starts with a break", ->
 
-       l = new Layout
 
-       l.openBlock(conf top: 1).write('\na').close()
 
-       l.write 'b'
 
-       get(l).should.equal '\n\na\nb'
 
-     it "margin top should work for: line, block, when line ends with a break", ->
 
-       l = new Layout
 
-       l.write 'a\n'
 
-       l.openBlock(conf top: 1).write('b').close()
 
-       get(l).should.equal 'a\n\n\nb'
 
-     it "margin top should work for: line, block, when there are two breaks in between", ->
 
-       l = new Layout
 
-       l.write 'a\n'
 
-       l.openBlock(conf top: 1).write('\nb').close()
 
-       get(l).should.equal 'a\n\n\n\nb'
 
-     it "margin bottom should work for: line, block", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       l.openBlock(conf bottom: 1).write('b').close()
 
-       get(l).should.equal 'a\nb\n'
 
-     it "margin bottom should work for: block, line", ->
 
-       l = new Layout
 
-       l.openBlock(conf bottom: 1).write('a').close()
 
-       l.write 'b'
 
-       get(l).should.equal 'a\n\nb'
 
-     it "margin bottom should work for: block, line, when block ends with a break", ->
 
-       l = new Layout
 
-       l.openBlock(conf bottom: 1).write('a\n').close()
 
-       l.write 'b'
 
-       get(l).should.equal 'a\n\n\nb'
 
-     it "margin bottom should work for: block, line, when line starts with a break", ->
 
-       l = new Layout
 
-       l.openBlock(conf bottom: 1).write('a').close()
 
-       l.write '\nb'
 
-       get(l).should.equal 'a\n\n\nb'
 
-     it "margin bottom should work for: block, line, when there are two breaks in between", ->
 
-       l = new Layout
 
-       l.openBlock(conf bottom: 1).write('a\n').close()
 
-       l.write '\nb'
 
-       get(l).should.equal 'a\n\n\n\nb'
 
-   describe "blocks and blocks", ->
 
-     it "should not get extra break lines for full-width lines", ->
 
-       l = new Layout
 
-       l.openBlock(conf width: 20).write('01234567890123456789').close()
 
-       l.openBlock().write('b').close()
 
-       get(l).should.equal '01234567890123456789\nb'
 
-     it "should not get extra break lines for full-width lines followed by a margin", ->
 
-       l = new Layout
 
-       l.openBlock(conf width: 20, bottom: 1).write('01234567890123456789').close()
 
-       l.openBlock().write('b').close()
 
-       get(l).should.equal '01234567890123456789\n\nb'
 
-     it "a(top: 0, bottom: 0) b(top: 0, bottom: 0)", ->
 
-       l = new Layout
 
-       l.openBlock().write('a').close()
 
-       l.openBlock().write('b').close()
 
-       get(l).should.equal 'a\nb'
 
-     it "a(top: 0, bottom: 0) b(top: 1, bottom: 0)", ->
 
-       l = new Layout
 
-       l.openBlock().write('a').close()
 
-       l.openBlock(conf(top: 1)).write('b').close()
 
-       get(l).should.equal 'a\n\nb'
 
-     it "a(top: 0, bottom: 1) b(top: 0, bottom: 0)", ->
 
-       l = new Layout
 
-       l.openBlock(conf(bottom: 1)).write('a').close()
 
-       l.openBlock().write('b').close()
 
-       get(l).should.equal 'a\n\nb'
 
-     it "a(top: 0, bottom: 1   ) b(   top: 1, bottom: 0)", ->
 
-       l = new Layout
 
-       l.openBlock(conf(bottom: 1)).write('a').close()
 
-       l.openBlock(conf(top: 1)).write('b').close()
 
-       get(l).should.equal 'a\n\n\nb'
 
-     it "a(top: 0, bottom: 1 br) b(br top: 1, bottom: 0)", ->
 
-       l = new Layout
 
-       l.openBlock(conf(bottom: 1)).write('a\n').close()
 
-       l.openBlock(conf(top: 1)).write('\nb').close()
 
-       get(l).should.equal 'a\n\n\n\n\nb'
 
-     it "a(top: 2, bottom: 3 a1-br-a2) b(br-b1-br-br-b2-br top: 2, bottom: 3)", ->
 
-       l = new Layout
 
-       l.openBlock(conf(top: 2, bottom: 3)).write('a1\na2').close()
 
-       l.openBlock(conf(top: 2, bottom: 3)).write('\nb1\n\nb2\n').close()
 
-       get(l).should.equal '\n\na1\na2\n\n\n\n\n\n\nb1\n\nb2\n\n\n\n'
 
-   describe "nesting", ->
 
-     it "should break one line for nested blocks", ->
 
-       l = new Layout
 
-       l.write 'a'
 
-       b = l.openBlock()
 
-       c = b.openBlock().write('c').close()
 
-       b.close()
 
-       get(l).should.equal 'a\nc'
 
-     it "a(left: 2) > b(top: 2)", ->
 
-       l = new Layout
 
-       a = l.openBlock(conf(left: 2))
 
-       a.openBlock(conf(top: 2)).write('b').close()
 
-       a.close()
 
-       get(l).should.equal '  \n  \n  b'
 
-     it "a(left: 2) > b(bottom: 2)", ->
 
-       l = new Layout
 
-       a = l.openBlock(conf(left: 2))
 
-       a.openBlock(conf(bottom: 2)).write('b').close()
 
-       a.close()
 
-       get(l).should.equal '  b\n  \n  '
 
-   describe "bullets", ->
 
-     it "basic bullet", ->
 
-       l = new Layout
 
-       l.openBlock(conf(left: 3, bullet: yes)).write('a').close()
 
-       get(l).should.equal '-  a'
 
-     it "a(left: 3, bullet) > b(top:1)", ->
 
-       l = new Layout
 
-       a = l.openBlock(conf(left: 3, bullet: yes))
 
-       b = a.openBlock(conf(top: 1)).write('b').close()
 
-       a.close()
 
-       get(l).should.equal '-  \n   b'
 
 
  |