local t = require('test.testutil')
local n = require('test.functional.testnvim')()
local Screen = require('test.functional.ui.screen')

local feed = n.feed
local clear = n.clear
local write_file = t.write_file

describe('Diff mode screen with 3 diffs open', function()
  local fname = 'Xtest-functional-diff-screen-1'
  local fname_2 = fname .. '.2'
  local fname_3 = fname .. '.3'
  local screen

  local reread = function()
    feed(':e<cr><c-w>w:e<cr><c-w>w:e<cr><c-w>w')
  end

  setup(function()
    clear()
    os.remove(fname)
    os.remove(fname_2)
    os.remove(fname_3)
  end)

  teardown(function()
    os.remove(fname)
    os.remove(fname_2)
    os.remove(fname_3)
  end)

  before_each(function()
    clear()
    feed(':set diffopt=internal,filler,linematch:30<cr>')
    feed(':e ' .. fname .. '<cr>')
    feed(':vnew ' .. fname_2 .. '<cr>')
    feed(':vnew ' .. fname_3 .. '<cr>')
    feed(':windo diffthis<cr>')

    screen = Screen.new(100, 16)
    feed('<c-w>=')
    feed(':windo set nu!<cr>')
  end)

  describe(
    'setup the diff screen to look like a merge conflict with 3 files in diff mode',
    function()
      before_each(function()
        local f1 = [[

  common line
      AAA
      AAA
      AAA
      ]]
        local f2 = [[

  common line
  <<<<<<< HEAD
      AAA
      AAA
      AAA
  =======
      BBB
      BBB
      BBB
  >>>>>>> branch1
      ]]
        local f3 = [[

  common line
      BBB
      BBB
      BBB
      ]]

        write_file(fname, f1, false)
        write_file(fname_2, f2, false)
        write_file(fname_3, f3, false)
        reread()
      end)

      it('get from window 1', function()
        feed('1<c-w>w')
        feed(':2,6diffget screen-1.2<cr>')
        screen:expect([[
      {7:  }{8:  1 }^                           │{7:  }{8:  1 }                          │{7:  }{8:  1 }                           |
      {7:  }{8:  2 }common line                │{7:  }{8:  2 }common line               │{7:  }{8:  2 }common line                |
      {7:  }{8:  3 }{22:<<<<<<< HEAD               }│{7:  }{8:  3 }{22:<<<<<<< HEAD              }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  4 }    AAA                    │{7:  }{8:  4 }    AAA                   │{7:  }{8:  3 }    AAA                    |
      {7:  }{8:  5 }    AAA                    │{7:  }{8:  5 }    AAA                   │{7:  }{8:  4 }    AAA                    |
      {7:  }{8:  6 }    AAA                    │{7:  }{8:  6 }    AAA                   │{7:  }{8:  5 }    AAA                    |
      {7:  }{8:  7 }{22:=======                    }│{7:  }{8:  7 }{22:=======                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  8 }{22:    BBB                    }│{7:  }{8:  8 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  9 }{22:    BBB                    }│{7:  }{8:  9 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8: 10 }{22:    BBB                    }│{7:  }{8: 10 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8: 11 }{22:>>>>>>> branch1            }│{7:  }{8: 11 }{22:>>>>>>> branch1           }│{7:  }{8:    }{23:---------------------------}|
      {1:~                                }│{1:~                               }│{1:~                                }|*3
      {3:<-functional-diff-screen-1.3 [+]  }{2:<est-functional-diff-screen-1.2  Xtest-functional-diff-screen-1   }|
      :2,6diffget screen-1.2                                                                              |
      ]])
      end)

      it('get from window 2', function()
        feed('2<c-w>w')
        feed(':5,7diffget screen-1.3<cr>')
        screen:expect([[
      {7:  }{8:  1 }                           │{7:  }{8:  1 }^                          │{7:  }{8:  1 }                           |
      {7:  }{8:  2 }common line                │{7:  }{8:  2 }common line               │{7:  }{8:  2 }common line                |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  3 }{22:<<<<<<< HEAD              }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  4 }{22:    AAA                   }│{7:  }{8:  3 }{22:    AAA                    }|
      {7:  }{8:  3 }{22:    BBB                    }│{7:  }{8:  5 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  4 }{4:    }{27:BBB}{4:                    }│{7:  }{8:  6 }{4:    }{27:BBB}{4:                   }│{7:  }{8:  4 }{4:    }{27:AAA}{4:                    }|
      {7:  }{8:  5 }{4:    }{27:BBB}{4:                    }│{7:  }{8:  7 }{4:    }{27:BBB}{4:                   }│{7:  }{8:  5 }{4:    }{27:AAA}{4:                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  8 }{22:>>>>>>> branch1           }│{7:  }{8:    }{23:---------------------------}|
      {1:~                                }│{1:~                               }│{1:~                                }|*6
      {2:Xtest-functional-diff-screen-1.3  }{3:<functional-diff-screen-1.2 [+]  }{2:Xtest-functional-diff-screen-1   }|
      :5,7diffget screen-1.3                                                                              |
      ]])
      end)

      it('get from window 3', function()
        feed('3<c-w>w')
        feed(':5,6diffget screen-1.2<cr>')
        screen:expect([[
      {7:  }{8:  1 }                           │{7:  }{8:  1 }                          │{7:  }{8:  1 }^                           |
      {7:  }{8:  2 }common line                │{7:  }{8:  2 }common line               │{7:  }{8:  2 }common line                |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  3 }{22:<<<<<<< HEAD              }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  4 }{22:    AAA                   }│{7:  }{8:  3 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  5 }{22:    AAA                   }│{7:  }{8:  4 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  6 }{22:    AAA                   }│{7:  }{8:  5 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  7 }{22:=======                   }│{7:  }{8:  6 }{22:=======                    }|
      {7:  }{8:  3 }    BBB                    │{7:  }{8:  8 }    BBB                   │{7:  }{8:  7 }    BBB                    |
      {7:  }{8:  4 }    BBB                    │{7:  }{8:  9 }    BBB                   │{7:  }{8:  8 }    BBB                    |
      {7:  }{8:  5 }    BBB                    │{7:  }{8: 10 }    BBB                   │{7:  }{8:  9 }    BBB                    |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8: 11 }{22:>>>>>>> branch1           }│{7:  }{8: 10 }{22:>>>>>>> branch1            }|
      {1:~                                }│{1:~                               }│{1:~                                }|*3
      {2:Xtest-functional-diff-screen-1.3  <est-functional-diff-screen-1.2  }{3:<st-functional-diff-screen-1 [+] }|
      :5,6diffget screen-1.2                                                                              |
      ]])
      end)

      it('put from window 2 - part', function()
        feed('2<c-w>w')
        feed(':6,8diffput screen-1<cr>')
        screen:expect([[
      {7:  }{8:  1 }                           │{7:  }{8:  1 }^                          │{7:  }{8:  1 }                           |
      {7:  }{8:  2 }common line                │{7:  }{8:  2 }common line               │{7:  }{8:  2 }common line                |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  3 }{22:<<<<<<< HEAD              }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  4 }{22:    AAA                   }│{7:  }{8:  3 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  5 }{22:    AAA                   }│{7:  }{8:  4 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  6 }{22:    AAA                   }│{7:  }{8:  5 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  7 }{22:=======                   }│{7:  }{8:  6 }{22:=======                    }|
      {7:  }{8:  3 }{22:    BBB                    }│{7:  }{8:  8 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  4 }{22:    BBB                    }│{7:  }{8:  9 }{22:    BBB                   }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:  5 }    BBB                    │{7:  }{8: 10 }    BBB                   │{7:  }{8:  7 }    BBB                    |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8: 11 }{22:>>>>>>> branch1           }│{7:  }{8:    }{23:---------------------------}|
      {1:~                                }│{1:~                               }│{1:~                                }|*3
      {2:Xtest-functional-diff-screen-1.3  }{3:<est-functional-diff-screen-1.2  }{2:<st-functional-diff-screen-1 [+] }|
      :6,8diffput screen-1                                                                                |
      ]])
      end)

      it('put from window 2 - part to end', function()
        feed('2<c-w>w')
        feed(':6,11diffput screen-1<cr>')
        screen:expect([[
      {7:  }{8:  1 }                           │{7:  }{8:  1 }^                          │{7:  }{8:  1 }                           |
      {7:  }{8:  2 }common line                │{7:  }{8:  2 }common line               │{7:  }{8:  2 }common line                |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  3 }{22:<<<<<<< HEAD              }│{7:  }{8:    }{23:---------------------------}|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  4 }{22:    AAA                   }│{7:  }{8:  3 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  5 }{22:    AAA                   }│{7:  }{8:  4 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  6 }{22:    AAA                   }│{7:  }{8:  5 }{22:    AAA                    }|
      {7:  }{8:    }{23:---------------------------}│{7:  }{8:  7 }{22:=======                   }│{7:  }{8:  6 }{22:=======                    }|
      {7:  }{8:  3 }    BBB                    │{7:  }{8:  8 }    BBB                   │{7:  }{8:  7 }    BBB                    |
      {7:  }{8:  4 }    BBB                    │{7:  }{8:  9 }    BBB                   │{7:  }{8:  8 }    BBB                    |
      {7:  }{8:  5 }    BBB                    │{7:  }{8: 10 }    BBB                   │{7:  }{8:  9 }    BBB                    |
      {7:  }{8:    }{23:---------------------------}│{7:  }{8: 11 }{22:>>>>>>> branch1           }│{7:  }{8: 10 }{22:>>>>>>> branch1            }|
      {1:~                                }│{1:~                               }│{1:~                                }|*3
      {2:Xtest-functional-diff-screen-1.3  }{3:<est-functional-diff-screen-1.2  }{2:<st-functional-diff-screen-1 [+] }|
      :6,11diffput screen-1                                                                               |
      ]])
      end)
    end
  )
end)

describe('Diff mode screen with 2 diffs open', function()
  local fname = 'Xtest-functional-diff-screen-1'
  local fname_2 = fname .. '.2'
  local screen

  local reread = function()
    feed(':e<cr><c-w>w:e<cr><c-w>w:e<cr><c-w>w')
  end

  setup(function()
    clear()
    os.remove(fname)
    os.remove(fname_2)
  end)

  teardown(function()
    os.remove(fname)
    os.remove(fname_2)
  end)

  before_each(function()
    clear()
    feed(':e ' .. fname .. '<cr>')
    feed(':vnew ' .. fname_2 .. '<cr>')
    feed(':windo diffthis<cr>')

    screen = Screen.new(100, 20)
    feed('<c-w>=')
    feed(':windo set nu!<cr>')
  end)

  describe('setup a diff with 2 files and set linematch:30', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:30<cr>')
      local f1 = [[

common line
common line

DEFabc
xyz
xyz
xyz
DEFabc
DEFabc
DEFabc
common line
common line
DEF
common line
DEF
something
      ]]
      local f2 = [[

common line
common line

ABCabc
ABCabc
ABCabc
ABCabc
common line
common line
common line
something
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it('get from window 1 from line 5 to 9', function()
      feed('1<c-w>w')
      feed(':5,9diffget<cr>')
      screen:expect([[
      {7:+ }{8:  1 }{13:^+--  7 lines: common line··················}│{7:+ }{8:  1 }{13:+--  7 lines: common line···················}|
      {7:  }{8:  8 }xyz                                        │{7:  }{8:  8 }xyz                                         |
      {7:  }{8:  9 }DEFabc                                     │{7:  }{8:  9 }DEFabc                                      |
      {7:  }{8: 10 }DEFabc                                     │{7:  }{8: 10 }DEFabc                                      |
      {7:  }{8: 11 }DEFabc                                     │{7:  }{8: 11 }DEFabc                                      |
      {7:  }{8: 12 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 13 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 14 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 15 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|*7
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :5,9diffget                                                                                         |
      ]])
    end)
    it('get from window 2 from line 5 to 10', function()
      feed('2<c-w>w')
      feed(':5,10diffget<cr>')
      screen:expect([[
      {7:- }{8:  1 }                                           │{7:- }{8:  1 }^                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }ABCabc                                     │{7:  }{8:  5 }ABCabc                                      |
      {7:  }{8:  6 }ABCabc                                     │{7:  }{8:  6 }ABCabc                                      |
      {7:  }{8:  7 }ABCabc                                     │{7:  }{8:  7 }ABCabc                                      |
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8:  8 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8:  9 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 10 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 11 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 13 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 14 }something                                   |
      {1:~                                                }│{1:~                                                 }|*4
      {2:Xtest-functional-diff-screen-1.2                  }{3:Xtest-functional-diff-screen-1 [+]                }|
      :5,10diffget                                                                                        |
      ]])
    end)
    it('get all from window 2', function()
      feed('2<c-w>w')
      feed(':4,17diffget<cr>')
      screen:expect([[
      {7:+ }{8:  1 }{13:+-- 12 lines: common line··················}│{7:+ }{8:  1 }{13:^+-- 12 lines: common line···················}|
      {1:~                                                }│{1:~                                                 }|*17
      {2:Xtest-functional-diff-screen-1.2                  }{3:Xtest-functional-diff-screen-1 [+]                }|
      :4,17diffget                                                                                        |
      ]])
    end)
    it('get all from window 1', function()
      feed('1<c-w>w')
      feed(':4,12diffget<cr>')
      screen:expect([[
      {7:+ }{8:  1 }{13:^+-- 17 lines: common line··················}│{7:+ }{8:  1 }{13:+-- 17 lines: common line···················}|
      {1:~                                                }│{1:~                                                 }|*17
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :4,12diffget                                                                                        |
      ]])
    end)
    it('get from window 1 using do 1 line 5', function()
      feed('1<c-w>w')
      feed('5gg')
      feed('do')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }^DEFabc                                     │{7:  }{8:  5 }DEFabc                                      |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('get from window 1 using do 2 line 6', function()
      feed('1<c-w>w')
      feed('6gg')
      feed('do')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }^DEFabc                                     │{7:  }{8:  9 }DEFabc                                      |
      {7:  }{8:  7 }DEFabc                                     │{7:  }{8: 10 }DEFabc                                      |
      {7:  }{8:  8 }DEFabc                                     │{7:  }{8: 11 }DEFabc                                      |
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('get from window 1 using do 2 line 7', function()
      feed('1<c-w>w')
      feed('7gg')
      feed('do')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }DEFabc                                     │{7:  }{8:  9 }DEFabc                                      |
      {7:  }{8:  7 }^DEFabc                                     │{7:  }{8: 10 }DEFabc                                      |
      {7:  }{8:  8 }DEFabc                                     │{7:  }{8: 11 }DEFabc                                      |
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('get from window 1 using do 2 line 11', function()
      feed('1<c-w>w')
      feed('11gg')
      feed('do')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8: 11 }DEF                                        │{7:  }{8: 14 }DEF                                         |
      {7:  }{8: 12 }^common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 13 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('get from window 1 using do 2 line 12', function()
      feed('1<c-w>w')
      feed('12gg')
      feed('do')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8: 12 }DEF                                        │{7:  }{8: 16 }DEF                                         |
      {7:  }{8: 13 }^something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 1 using dp 1 line 5', function()
      feed('1<c-w>w')
      feed('5gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }^ABCabc                                     │{7:  }{8:  5 }ABCabc                                      |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1 [+]                }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 1 using dp 2 line 6', function()
      feed('1<c-w>w')
      feed('6gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }^ABCabc                                     │{7:  }{8:  9 }ABCabc                                      |
      {7:  }{8:  7 }ABCabc                                     │{7:  }{8: 10 }ABCabc                                      |
      {7:  }{8:  8 }ABCabc                                     │{7:  }{8: 11 }ABCabc                                      |
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1 [+]                }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 1 using dp 2 line 7', function()
      feed('1<c-w>w')
      feed('7gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }ABCabc                                     │{7:  }{8:  9 }ABCabc                                      |
      {7:  }{8:  7 }^ABCabc                                     │{7:  }{8: 10 }ABCabc                                      |
      {7:  }{8:  8 }ABCabc                                     │{7:  }{8: 11 }ABCabc                                      |
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1 [+]                }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 1 using dp 2 line 11', function()
      feed('1<c-w>w')
      feed('11gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8: 11 }^common line                                │{7:  }{8: 14 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 15 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 16 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1 [+]                }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 1 using dp 2 line 12', function()
      feed('1<c-w>w')
      feed('12gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8: 12 }^something                                  │{7:  }{8: 16 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {1:~                                                }│{1:~                                                 }|
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1 [+]                }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 2 using dp line 6', function()
      feed('2<c-w>w')
      feed('6gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  6 }xyz                                        │{7:  }{8:  6 }^xyz                                         |
      {7:  }{8:  7 }xyz                                        │{7:  }{8:  7 }xyz                                         |
      {7:  }{8:  8 }xyz                                        │{7:  }{8:  8 }xyz                                         |
      {7:  }{8:  9 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 10 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 11 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 12 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 13 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 14 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 15 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {2:Xtest-functional-diff-screen-1.2 [+]              }{3:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 2 using dp line 8', function()
      feed('2<c-w>w')
      feed('8gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  6 }xyz                                        │{7:  }{8:  6 }xyz                                         |
      {7:  }{8:  7 }xyz                                        │{7:  }{8:  7 }xyz                                         |
      {7:  }{8:  8 }xyz                                        │{7:  }{8:  8 }^xyz                                         |
      {7:  }{8:  9 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 10 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 11 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8: 12 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 13 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 14 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 15 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {2:Xtest-functional-diff-screen-1.2 [+]              }{3:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 2 using dp line 9', function()
      feed('2<c-w>w')
      feed('9gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }DEFabc                                     │{7:  }{8:  9 }^DEFabc                                      |
      {7:  }{8:  7 }DEFabc                                     │{7:  }{8: 10 }DEFabc                                      |
      {7:  }{8:  8 }DEFabc                                     │{7:  }{8: 11 }DEFabc                                      |
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 16 }{22:DEF                                         }|
      {7:  }{8: 12 }something                                  │{7:  }{8: 17 }something                                   |
      {1:~                                                }│{1:~                                                 }|
      {2:Xtest-functional-diff-screen-1.2 [+]              }{3:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
    it('put from window 2 using dp line 17', function()
      feed('2<c-w>w')
      feed('17gg')
      feed('dp')
      screen:expect([[
      {7:  }{8:  1 }                                           │{7:  }{8:  1 }                                            |
      {7:  }{8:  2 }common line                                │{7:  }{8:  2 }common line                                 |
      {7:  }{8:  3 }common line                                │{7:  }{8:  3 }common line                                 |
      {7:  }{8:  4 }                                           │{7:  }{8:  4 }                                            |
      {7:  }{8:  5 }{27:ABC}{4:abc                                     }│{7:  }{8:  5 }{27:DEF}{4:abc                                      }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  6 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  7 }{22:xyz                                         }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  8 }{22:xyz                                         }|
      {7:  }{8:  6 }{27:ABC}{4:abc                                     }│{7:  }{8:  9 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  7 }{27:ABC}{4:abc                                     }│{7:  }{8: 10 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  8 }{27:ABC}{4:abc                                     }│{7:  }{8: 11 }{27:DEF}{4:abc                                      }|
      {7:  }{8:  9 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 10 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8: 14 }{22:DEF                                         }|
      {7:  }{8: 11 }common line                                │{7:  }{8: 15 }common line                                 |
      {7:  }{8: 12 }DEF                                        │{7:  }{8: 16 }DEF                                         |
      {7:  }{8: 13 }something                                  │{7:  }{8: 17 }^something                                   |
      {1:~                                                }│{1:~                                                 }|
      {2:Xtest-functional-diff-screen-1.2 [+]              }{3:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
  end)
  describe('setup a diff with 2 files and set linematch:30', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:30<cr>')
      local f1 = [[
// abc d
// d
// d
      ]]
      local f2 = [[

abc d
d
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it('display results', function()
      screen:expect([[
      {7:  }{8:  1 }{22:^                                           }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  2 }{4:abc d                                      }│{7:  }{8:  1 }{27:// }{4:abc d                                    }|
      {7:  }{8:  3 }{4:d                                          }│{7:  }{8:  2 }{27:// }{4:d                                        }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  3 }{22:// d                                        }|
      {1:~                                                }│{1:~                                                 }|*14
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
  end)
  describe('setup a diff with 2 files and set linematch:30, with ignore white', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:30,iwhiteall<cr>')
      local f1 = [[
void testFunction () {
  for (int i = 0; i < 10; i++) {
    for (int j = 0; j < 10; j++) {
    }
  }
}
      ]]
      local f2 = [[
void testFunction () {
  // for (int j = 0; j < 10; i++) {
  // }
}
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it('display results', function()
      screen:expect([[
      {7:  }{8:  1 }^void testFunction () {                     │{7:  }{8:  1 }void testFunction () {                      |
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  2 }{22:  for (int i = 0; i < 10; i++) {            }|
      {7:  }{8:  2 }{4:  }{27:// for (int j = 0; j < 10; i}{4:++) {        }│{7:  }{8:  3 }{4:    }{27:for (int j = 0; j < 10; j}{4:++) {          }|
      {7:  }{8:  3 }{4:  }{27:// }{4:}                                     }│{7:  }{8:  4 }{4:    }                                       }|
      {7:  }{8:    }{23:-------------------------------------------}│{7:  }{8:  5 }{22:  }                                         }|
      {7:  }{8:  4 }}                                          │{7:  }{8:  6 }}                                           |
      {1:~                                                }│{1:~                                                 }|*12
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
  end)
  describe('a diff that would result in multiple groups before grouping optimization', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:30<cr>')
      local f1 = [[
!A
!B
!C
      ]]
      local f2 = [[
?Z
?A
?B
?C
?A
?B
?B
?C
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it('display results', function()
      screen:expect([[
      {7:  }{8:  1 }{22:^?Z                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  2 }{27:?}{4:A                                         }│{7:  }{8:  1 }{27:!}{4:A                                          }|
      {7:  }{8:  3 }{27:?}{4:B                                         }│{7:  }{8:  2 }{27:!}{4:B                                          }|
      {7:  }{8:  4 }{27:?}{4:C                                         }│{7:  }{8:  3 }{27:!}{4:C                                          }|
      {7:  }{8:  5 }{22:?A                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  6 }{22:?B                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  7 }{22:?B                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  8 }{22:?C                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {1:~                                                }│{1:~                                                 }|*10
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
  end)
  describe('a diff that would result in multiple groups before grouping optimization', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:30<cr>')
      local f1 = [[
!A
!B
!C
      ]]
      local f2 = [[
?A
?Z
?B
?C
?A
?B
?C
?C
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it('display results', function()
      screen:expect([[
      {7:  }{8:  1 }{22:^?A                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  2 }{22:?Z                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  3 }{22:?B                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  4 }{22:?C                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  5 }{27:?}{4:A                                         }│{7:  }{8:  1 }{27:!}{4:A                                          }|
      {7:  }{8:  6 }{27:?}{4:B                                         }│{7:  }{8:  2 }{27:!}{4:B                                          }|
      {7:  }{8:  7 }{27:?}{4:C                                         }│{7:  }{8:  3 }{27:!}{4:C                                          }|
      {7:  }{8:  8 }{22:?C                                         }│{7:  }{8:    }{23:--------------------------------------------}|
      {1:~                                                }│{1:~                                                 }|*10
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
    end)
  end)
  describe('setup a diff with 2 files and set linematch:10', function()
    before_each(function()
      feed(':set diffopt=internal,filler,linematch:10<cr>')
      local f1 = [[
common line
HIL

aABCabc
aABCabc
aABCabc
aABCabc
common line
HIL
common line
something
      ]]
      local f2 = [[
common line
DEF
GHI
something

aDEFabc
xyz
xyz
xyz
aDEFabc
aDEFabc
aDEFabc
common line
DEF
GHI
something else
common line
something
      ]]
      write_file(fname, f1, false)
      write_file(fname_2, f2, false)
      reread()
    end)

    it(
      'enable linematch for the longest diff block by increasing the number argument passed to linematch',
      function()
        feed('1<c-w>w')
        -- linematch is disabled for the longest diff because it's combined line length is over 10
        screen:expect([[
      {7:  }{8:  1 }^common line                                │{7:  }{8:  1 }common line                                 |
      {7:  }{8:  2 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  3 }{27:GHI}{4:                                        }│{7:  }{8:  2 }{27:HIL}{4:                                         }|
      {7:  }{8:  4 }{22:something                                  }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  5 }                                           │{7:  }{8:  3 }                                            |
      {7:  }{8:  6 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  4 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8:  7 }{27:xyz}{4:                                        }│{7:  }{8:  5 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  8 }{27:xyz}{4:                                        }│{7:  }{8:  6 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  9 }{27:xyz}{4:                                        }│{7:  }{8:  7 }{27:aABCabc}{4:                                     }|
      {7:  }{8: 10 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 11 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 12 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 13 }common line                                │{7:  }{8:  8 }common line                                 |
      {7:  }{8: 14 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 15 }{27:GHI}{4:                                        }│{7:  }{8:  9 }{27:HIL}{4:                                         }|
      {7:  }{8: 16 }{22:something else                             }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 17 }common line                                │{7:  }{8: 10 }common line                                 |
      {7:  }{8: 18 }something                                  │{7:  }{8: 11 }something                                   |
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :e                                                                                                  |
      ]])
        -- enable it by increasing the number
        feed(':set diffopt-=linematch:10<cr>')
        feed(':set diffopt+=linematch:30<cr>')
        screen:expect([[
      {7:  }{8:  1 }^common line                                │{7:  }{8:  1 }common line                                 |
      {7:  }{8:  2 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  3 }{27:GHI}{4:                                        }│{7:  }{8:  2 }{27:HIL}{4:                                         }|
      {7:  }{8:  4 }{22:something                                  }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  5 }                                           │{7:  }{8:  3 }                                            |
      {7:  }{8:  6 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  4 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8:  7 }{22:xyz                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  8 }{22:xyz                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  9 }{22:xyz                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 10 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  5 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8: 11 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  6 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8: 12 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  7 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8: 13 }common line                                │{7:  }{8:  8 }common line                                 |
      {7:  }{8: 14 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 15 }{27:GHI}{4:                                        }│{7:  }{8:  9 }{27:HIL}{4:                                         }|
      {7:  }{8: 16 }{22:something else                             }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 17 }common line                                │{7:  }{8: 10 }common line                                 |
      {7:  }{8: 18 }something                                  │{7:  }{8: 11 }something                                   |
      {3:Xtest-functional-diff-screen-1.2                  }{2:Xtest-functional-diff-screen-1                    }|
      :set diffopt+=linematch:30                                                                          |
      ]])
      end
    )
    it('get all from second window', function()
      feed('2<c-w>w')
      feed(':1,12diffget<cr>')
      screen:expect([[
      {7:+ }{8:  1 }{13:+-- 18 lines: common line··················}│{7:+ }{8:  1 }{13:^+-- 18 lines: common line···················}|
      {1:~                                                }│{1:~                                                 }|*17
      {2:Xtest-functional-diff-screen-1.2                  }{3:Xtest-functional-diff-screen-1 [+]                }|
      :1,12diffget                                                                                        |
      ]])
    end)
    it('get all from first window', function()
      feed('1<c-w>w')
      feed(':1,19diffget<cr>')
      screen:expect([[
      {7:+ }{8:  1 }{13:^+-- 11 lines: common line··················}│{7:+ }{8:  1 }{13:+-- 11 lines: common line···················}|
      {1:~                                                }│{1:~                                                 }|*17
      {3:Xtest-functional-diff-screen-1.2 [+]              }{2:Xtest-functional-diff-screen-1                    }|
      :1,19diffget                                                                                        |
      ]])
    end)
    it(
      'get part of the non linematched diff block in window 2 line 7 - 8 (non line matched block)',
      function()
        feed('2<c-w>w')
        feed(':7,8diffget<cr>')
        screen:expect([[
      {7:  }{8:  1 }common line                                │{7:  }{8:  1 }^common line                                 |
      {7:  }{8:  2 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  3 }{27:GHI}{4:                                        }│{7:  }{8:  2 }{27:HIL}{4:                                         }|
      {7:  }{8:  4 }{22:something                                  }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  5 }                                           │{7:  }{8:  3 }                                            |
      {7:  }{8:  6 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  4 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8:  7 }{27:xyz}{4:                                        }│{7:  }{8:  5 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  8 }{27:xyz}{4:                                        }│{7:  }{8:  6 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  9 }xyz                                        │{7:  }{8:  7 }xyz                                         |
      {7:  }{8: 10 }aDEFabc                                    │{7:  }{8:  8 }aDEFabc                                     |
      {7:  }{8: 11 }aDEFabc                                    │{7:  }{8:  9 }aDEFabc                                     |
      {7:  }{8: 12 }aDEFabc                                    │{7:  }{8: 10 }aDEFabc                                     |
      {7:  }{8: 13 }common line                                │{7:  }{8: 11 }common line                                 |
      {7:  }{8: 14 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 15 }{27:GHI}{4:                                        }│{7:  }{8: 12 }{27:HIL}{4:                                         }|
      {7:  }{8: 16 }{22:something else                             }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 17 }common line                                │{7:  }{8: 13 }common line                                 |
      {7:  }{8: 18 }something                                  │{7:  }{8: 14 }something                                   |
      {2:Xtest-functional-diff-screen-1.2                  }{3:Xtest-functional-diff-screen-1 [+]                }|
      :7,8diffget                                                                                         |
      ]])
      end
    )
    it(
      'get part of the non linematched diff block in window 2 line 8 - 10 (line matched block)',
      function()
        feed('2<c-w>w')
        feed(':8,10diffget<cr>')
        screen:expect([[
      {7:  }{8:  1 }common line                                │{7:  }{8:  1 }^common line                                 |
      {7:  }{8:  2 }{22:DEF                                        }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  3 }{27:GHI}{4:                                        }│{7:  }{8:  2 }{27:HIL}{4:                                         }|
      {7:  }{8:  4 }{22:something                                  }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8:  5 }                                           │{7:  }{8:  3 }                                            |
      {7:  }{8:  6 }{4:a}{27:DEF}{4:abc                                    }│{7:  }{8:  4 }{4:a}{27:ABC}{4:abc                                     }|
      {7:  }{8:  7 }{27:xyz}{4:                                        }│{7:  }{8:  5 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  8 }{27:xyz}{4:                                        }│{7:  }{8:  6 }{27:aABCabc}{4:                                     }|
      {7:  }{8:  9 }{27:xyz}{4:                                        }│{7:  }{8:  7 }{27:aABCabc}{4:                                     }|
      {7:  }{8: 10 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 11 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 12 }{22:aDEFabc                                    }│{7:  }{8:    }{23:--------------------------------------------}|
      {7:  }{8: 13 }common line                                │{7:  }{8:  8 }common line                                 |
      {7:  }{8: 14 }DEF                                        │{7:  }{8:  9 }DEF                                         |
      {7:  }{8: 15 }GHI                                        │{7:  }{8: 10 }GHI                                         |
      {7:  }{8: 16 }something else                             │{7:  }{8: 11 }something else                              |
      {7:  }{8: 17 }common line                                │{7:  }{8: 12 }common line                                 |
      {7:  }{8: 18 }something                                  │{7:  }{8: 13 }something                                   |
      {2:Xtest-functional-diff-screen-1.2                  }{3:Xtest-functional-diff-screen-1 [+]                }|
      :8,10diffget                                                                                        |
      ]])
      end
    )
  end)
end)

describe('regressions', function()
  local screen

  it("doesn't crash with long lines", function()
    clear()
    feed(':set diffopt=internal.filler,linematch:30<cr>')
    screen = Screen.new(100, 20)
    -- line must be greater than MATCH_CHAR_MAX_LEN
    n.api.nvim_buf_set_lines(0, 0, -1, false, { string.rep('a', 1000) .. 'hello' })
    n.exec 'vnew'
    n.api.nvim_buf_set_lines(0, 0, -1, false, { string.rep('a', 1010) .. 'world' })
    n.exec 'windo diffthis'
  end)

  it('properly computes filler lines for hunks bigger than linematch limit', function()
    clear()
    feed(':set diffopt=internal,filler,linematch:10<cr>')
    screen = Screen.new(100, 20)
    local lines = {}
    for i = 0, 29 do
      lines[#lines + 1] = tostring(i)
    end
    n.api.nvim_buf_set_lines(0, 0, -1, false, lines)
    n.exec 'vnew'
    n.api.nvim_buf_set_lines(0, 0, -1, false, { '00', '29' })
    n.exec 'windo diffthis'
    feed('<C-e>')
    screen:expect {
      grid = [[
      {1:  }{2:------------------------------------------------}│{1:  }{3:^1                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:2                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:3                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:4                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:5                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:6                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:7                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:8                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:9                                              }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:10                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:11                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:12                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:13                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:14                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:15                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:16                                             }|
      {1:  }{2:------------------------------------------------}│{1:  }{3:17                                             }|
      {1:  }29                                              │{1:  }{3:18                                             }|
      {4:[No Name] [+]                                      }{5:[No Name] [+]                                    }|
                                                                                                          |
    ]],
      attr_ids = {
        [1] = { foreground = Screen.colors.DarkBlue, background = Screen.colors.Grey },
        [2] = {
          bold = true,
          background = Screen.colors.LightCyan,
          foreground = Screen.colors.Blue1,
        },
        [3] = { background = Screen.colors.LightBlue },
        [4] = { reverse = true },
        [5] = { reverse = true, bold = true },
      },
    }
  end)

  -- oldtest: Test_linematch_3diffs_sanity_check()
  it('sanity check with 3 diff buffers', function()
    clear()
    screen = Screen.new(75, 20)
    n.api.nvim_buf_set_lines(0, 0, -1, false, { 'abcd', 'def', 'hij' })
    n.exec('rightbelow vnew')
    n.api.nvim_buf_set_lines(0, 0, -1, false, { 'defq', 'hijk', 'nopq' })
    n.exec('rightbelow vnew')
    n.api.nvim_buf_set_lines(0, 0, -1, false, { 'hijklm', 'nopqr', 'stuv' })
    n.exec([[
      set diffopt=internal,filler,linematch:60
      windo diffthis | wincmd t
      call feedkeys("Aq\<esc>")
      call feedkeys("GAklm\<esc>")
      call feedkeys("o")
    ]])
    screen:expect([[
      {7:  }{22:abcdq                 }│{7:  }{23:----------------------}│{7:  }{23:-----------------------}|
      {7:  }{4:def                   }│{7:  }{4:def}{27:q}{4:                  }│{7:  }{23:-----------------------}|
      {7:  }{4:hijk}{27:lm}{4:                }│{7:  }{4:hijk                  }│{7:  }{4:hijk}{27:lm}{4:                 }|
      {7:  }{23:----------------------}│{7:  }{4:nopq                  }│{7:  }{4:nopq}{27:r}{4:                  }|
      {7:  }{4:^                      }│{7:  }{23:----------------------}│{7:  }{27:stuv}{4:                   }|
      {1:~                       }│{1:~                       }│{1:~                        }|*13
      {3:[No Name] [+]            }{2:[No Name] [+]            [No Name] [+]            }|
      {5:-- INSERT --}                                                               |
    ]])
  end)
end)
