Repository: fabricjs/fabric.js
Pull request #9083 (2023-07-09 22:09:58)

test(Text): Add some tests for text in Jest
<!--
        Hi there!
        Thanks for taking the time and putting the effort into making fabric better! 💖
        Take a look at /CONTRIBUTING.md for crucial instructions regarding local setup, testing etc.
        https://github.com/fabricjs/fabric.js/blob/master/CONTRIBUTING.md

        Adding tests that verify your fix and safeguard it from unwanted loss and changes is a MUST.

        Pull Requests are not always simple. Don't hesitate to ask for help (beware of [gotchas](http://fabricjs.com/fabric-gotchas) 😓).
        We appreciate your effort and would like the process to be productive and enjoyable.
        A strong community means a strong and better product for everyone.
-->

## Motivation

move tests to jest

<!-- Why you are proposing -->
<!-- You can use the @closes notation to mark issues that will be resolved by this PR -->

## Description

extract tests from #9081 

<!-- What you are proposing -->

## Changes

<!-- before the fix vs. after -->

## Gist

<!-- Technical stuff if necessary -->

## In Action

<!-- Show case your accomplishment -->
<!-- Upload screenshots, screencasts and live examples showing your fix in contrast to the current state -->


github-actions[bot]: <!-- BUILD STATS COMMENT -->
**Build Stats**

 | file / KB (diff) | bundled | minified | 
 | --- | --- | --- | 
 | fabric | 922.786 (**+0.079**) | 303.334 (**+0.061**) | 

github-actions[bot]: 

Coverage after merging <b>ci-text-jest-tests</b> into <b>master</b> will be<table><tbody><tr><th>83.04%</th></tr></tbody></table>

<details><summary>Coverage Report</summary><table><tbody><tr><th>File</th><th>Stmts</th><th>Branches</th><th>Funcs</th><th>Lines</th><th>Uncovered Lines</th></tr><tr><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts'>index.node.ts</a></td><td><b>7.69%</b></td><td>100%</td><td><b>0%</b></td><td><b>14.29%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L23'>23</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L35'>35</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L38'>38</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/index.node.ts#L41'>41</a></td></tr><tr><td colspan='6'><b>src</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/ClassRegistry.ts'>ClassRegistry.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Collection.ts'>Collection.ts</a></td><td><b>94.71%</b></td><td><b>94.64%</b></td><td><b>86.67%</b></td><td><b>97.09%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Collection.ts#L101'>101</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Collection.ts#L104'>104</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Collection.ts#L207-L208'>207&ndash;208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Collection.ts#L233-L234'>233&ndash;234</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/CommonMethods.ts'>CommonMethods.ts</a></td><td><b>96.55%</b></td><td><b>87.50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/CommonMethods.ts#L10'>10</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Intersection.ts'>Intersection.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts'>Observable.ts</a></td><td><b>87.23%</b></td><td><b>85.29%</b></td><td><b>84.62%</b></td><td><b>89.36%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L144-L145'>144&ndash;145</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L170-L171'>170&ndash;171</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L39-L40'>39&ndash;40</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L48'>48</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L57'>57</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L91'>91</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Observable.ts#L99'>99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Point.ts'>Point.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Shadow.ts'>Shadow.ts</a></td><td><b>98.36%</b></td><td><b>95.65%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Shadow.ts#L178'>178</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/cache.ts'>cache.ts</a></td><td><b>97.06%</b></td><td><b>90%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/cache.ts#L57'>57</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts'>config.ts</a></td><td><b>75%</b></td><td><b>66.67%</b></td><td><b>66.67%</b></td><td><b>82.76%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L130'>130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L138-L140'>138&ndash;140</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/config.ts#L151-L153'>151&ndash;153</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/constants.ts'>constants.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/Pattern</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts'>Pattern.ts</a></td><td><b>92.31%</b></td><td><b>91.89%</b></td><td><b>90%</b></td><td><b>93.55%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts#L118'>118</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts#L129'>129</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts#L31'>31</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/Pattern/Pattern.ts#L94'>94</a></td></tr><tr><td colspan='6'><b>src/brushes</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/BaseBrush.ts'>BaseBrush.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts'>CircleBrush.ts</a></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L108'>108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L110'>110</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L112'>112</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L114-L116'>114&ndash;116</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L118-L121'>118&ndash;121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L128-L129'>128&ndash;129</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L138'>138</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L23-L24'>23&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L32-L36'>32&ndash;36</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L40-L44'>40&ndash;44</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L51-L54'>51&ndash;54</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L62-L66'>62&ndash;66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L68'>68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L76-L77'>76&ndash;77</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L79'>79</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L79-L82'>79&ndash;82</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L84'>84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L92-L93'>92&ndash;93</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L95'>95</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/CircleBrush.ts#L97-L99'>97&ndash;99</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PatternBrush.ts'>PatternBrush.ts</a></td><td><b>97.06%</b></td><td><b>87.50%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PatternBrush.ts#L21'>21</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts'>PencilBrush.ts</a></td><td><b>91.01%</b></td><td><b>82.35%</b></td><td>100%</td><td><b>93.75%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L122-L123'>122&ndash;123</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L152'>152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L152-L154'>152&ndash;154</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L176'>176</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L276'>276</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L280'>280</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L285-L286'>285&ndash;286</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L68-L69'>68&ndash;69</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/PencilBrush.ts#L84-L85'>84&ndash;85</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts'>SprayBrush.ts</a></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L107'>107</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L107-L108'>107&ndash;108</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L110-L111'>110&ndash;111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L118-L119'>118&ndash;119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L123-L127'>123&ndash;127</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L136'>136</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L140-L141'>140&ndash;141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L141'>141</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L149'>149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L149-L152'>149&ndash;152</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L154-L157'>154&ndash;157</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L161-L162'>161&ndash;162</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L164'>164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L166-L169'>166&ndash;169</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L172'>172</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L179'>179</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L180'>180</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L182'>182</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L184-L185'>184&ndash;185</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L187'>187</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L194-L195'>194&ndash;195</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L197-L198'>197&ndash;198</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L20'>20</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L201'>201</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L208'>208</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L21'>21</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L212'>212</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L22'>22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L22-L24'>22&ndash;24</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L28'>28</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L37'>37</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L44'>44</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L84-L86'>84&ndash;86</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L94-L96'>94&ndash;96</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/brushes/SprayBrush.ts#L98-L99'>98&ndash;99</a></td></tr><tr><td colspan='6'><b>src/canvas</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts'>Canvas.ts</a></td><td><b>79.05%</b></td><td><b>77.54%</b></td><td><b>83.05%</b></td><td><b>79.57%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1000-L1001'>1000&ndash;1001</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1001'>1001</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1001-L1003'>1001&ndash;1003</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1005-L1006'>1005&ndash;1006</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1006'>1006</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1006'>1006</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1008'>1008</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1016'>1016</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1016'>1016</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1016-L1018'>1016&ndash;1018</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1018'>1018</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1018'>1018</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1024-L1025'>1024&ndash;1025</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1033-L1034'>1033&ndash;1034</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1034'>1034</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1034-L1035'>1034&ndash;1035</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1040'>1040</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1042'>1042</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1073-L1075'>1073&ndash;1075</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1078-L1079'>1078&ndash;1079</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1083-L1084'>1083&ndash;1084</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1197-L1199'>1197&ndash;1199</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1202-L1203'>1202&ndash;1203</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1276'>1276</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1395'>1395</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L1515'>1515</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L161'>161</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L186'>186</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L296-L297'>296&ndash;297</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L300-L304'>300&ndash;304</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L309'>309</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L332-L333'>332&ndash;333</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L338-L343'>338&ndash;343</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L36'>36</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L363'>363</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L363'>363</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L363-L364'>363&ndash;364</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L364'>364</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L364-L365'>364&ndash;365</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L373'>373</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L378-L379'>378&ndash;379</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L379'>379</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L379-L380'>379&ndash;380</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L382'>382</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L391'>391</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L397-L398'>397&ndash;398</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L398'>398</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L398'>398</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L40'>40</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L441'>441</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L449'>449</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L453'>453</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L453'>453</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L453-L454'>453&ndash;454</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L456'>456</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L538-L539'>538&ndash;539</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L539'>539</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L539-L540'>539&ndash;540</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L546'>546</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L546'>546</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L546-L548'>546&ndash;548</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L568'>568</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L570'>570</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L570'>570</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L570-L571'>570&ndash;571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L571'>571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L571'>571</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L574'>574</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L574'>574</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L574-L575'>574&ndash;575</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L578'>578</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L587-L588'>587&ndash;588</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L590-L591'>590&ndash;591</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L593'>593</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L593-L594'>593&ndash;594</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L596-L597'>596&ndash;597</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L609-L610'>609&ndash;610</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L610'>610</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L610-L611'>610&ndash;611</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L613-L618'>613&ndash;618</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L624'>624</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L631'>631</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L668'>668</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L668'>668</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L668'>668</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L670'>670</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L672-L677'>672&ndash;677</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L683'>683</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L689'>689</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L689'>689</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L689-L690'>689&ndash;690</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L692'>692</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L695'>695</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L700'>700</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L713'>713</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L741'>741</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L741'>741</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L799-L800'>799&ndash;800</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L800'>800</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L800-L801'>800&ndash;801</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L803'>803</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L806-L807'>806&ndash;807</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L807'>807</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L807-L808'>807&ndash;808</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L810-L811'>810&ndash;811</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L814'>814</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L814-L816'>814&ndash;816</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L819-L820'>819&ndash;820</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L890'>890</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L902'>902</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L909'>909</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L930'>930</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L962'>962</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/Canvas.ts#L983-L984'>983&ndash;984</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts'>SelectableCanvas.ts</a></td><td><b>94.42%</b></td><td><b>92.24%</b></td><td><b>94.23%</b></td><td><b>96.15%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1115'>1115</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1115-L1116'>1115&ndash;1116</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1119'>1119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1139'>1139</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1139'>1139</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1188'>1188</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1196'>1196</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1315'>1315</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1317'>1317</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L1319-L1320'>1319&ndash;1320</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L519'>519</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L694-L695'>694&ndash;695</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L697-L698'>697&ndash;698</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L698'>698</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L698'>698</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L747-L748'>747&ndash;748</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L809-L810'>809&ndash;810</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L863-L865'>863&ndash;865</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L897'>897</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L902-L903'>902&ndash;903</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/SelectableCanvas.ts#L930-L931'>930&ndash;931</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts'>StaticCanvas.ts</a></td><td><b>96.77%</b></td><td><b>93.09%</b></td><td>100%</td><td><b>98.53%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1037-L1038'>1037&ndash;1038</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1038'>1038</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1038-L1039'>1038&ndash;1039</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1159'>1159</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1169'>1169</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1223-L1224'>1223&ndash;1224</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1227'>1227</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1262-L1263'>1262&ndash;1263</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1339'>1339</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1348'>1348</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1348'>1348</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1352'>1352</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1352'>1352</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L1399-L1400'>1399&ndash;1400</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L309-L310'>309&ndash;310</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L326'>326</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L694'>694</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/StaticCanvas.ts#L706-L707'>706&ndash;707</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts'>TextEditingManager.ts</a></td><td><b>84.31%</b></td><td><b>71.43%</b></td><td><b>91.67%</b></td><td><b>88%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts#L17-L18'>17&ndash;18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts#L18'>18</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts#L18-L19'>18&ndash;19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts#L19'>19</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/TextEditingManager.ts#L19'>19</a></td></tr><tr><td colspan='6'><b>src/canvas/DOMManagers</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/CanvasDOMManager.ts'>CanvasDOMManager.ts</a></td><td><b>95.52%</b></td><td><b>70%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/CanvasDOMManager.ts#L21-L22'>21&ndash;22</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/CanvasDOMManager.ts#L29'>29</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/StaticCanvasDOMManager.ts'>StaticCanvasDOMManager.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts'>util.ts</a></td><td><b>86.67%</b></td><td><b>80.56%</b></td><td><b>83.33%</b></td><td><b>93.94%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L14'>14</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L26'>26</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L74'>74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/canvas/DOMManagers/util.ts#L93-L94'>93&ndash;94</a></td></tr><tr><td colspan='6'><b>src/color</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/Color.ts'>Color.ts</a></td><td><b>94.96%</b></td><td><b>91.67%</b></td><td><b>96.30%</b></td><td><b>96.05%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/Color.ts#L233'>233</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/Color.ts#L258-L259'>258&ndash;259</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/Color.ts#L267-L268'>267&ndash;268</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/Color.ts#L48'>48</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/color_map.ts'>color_map.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/constants.ts'>constants.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts'>util.ts</a></td><td><b>85.71%</b></td><td><b>76.92%</b></td><td>100%</td><td><b>89.74%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L55-L56'>55&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L58-L59'>58&ndash;59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L61-L62'>61&ndash;62</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/color/util.ts#L89'>89</a></td></tr><tr><td colspan='6'><b>src/controls</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts'>Control.ts</a></td><td><b>93.33%</b></td><td><b>87.88%</b></td><td><b>91.67%</b></td><td><b>97.78%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts#L175'>175</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts#L240'>240</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts#L327'>327</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts#L327'>327</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/Control.ts#L362'>362</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/changeWidth.ts'>changeWidth.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/commonControls.ts'>commonControls.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts'>controlRendering.ts</a></td><td><b>81.63%</b></td><td><b>78%</b></td><td>100%</td><td><b>84.78%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L106'>106</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L111'>111</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L121'>121</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L50'>50</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L65-L72'>65&ndash;72</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/controlRendering.ts#L81-L82'>81&ndash;82</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/drag.ts'>drag.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/fireEvent.ts'>fireEvent.ts</a></td><td><b>88.89%</b></td><td><b>75%</b></td><td>100%</td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/fireEvent.ts#L13'>13</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts'>polyControl.ts</a></td><td><b>5.97%</b></td><td><b>0%</b></td><td><b>0%</b></td><td><b>11.11%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L100'>100</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L105'>105</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L119'>119</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L121-L124'>121&ndash;124</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L124'>124</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L127'>127</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L134'>134</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L17'>17</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L25-L29'>25&ndash;29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L50-L56'>50&ndash;56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L56'>56</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L58'>58</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L63-L64'>63&ndash;64</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L66'>66</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L82-L83'>82&ndash;83</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L83'>83</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L83-L84'>83&ndash;84</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L88-L90'>88&ndash;90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L90'>90</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/polyControl.ts#L92'>92</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts'>rotate.ts</a></td><td><b>19.57%</b></td><td><b>12.50%</b></td><td><b>50%</b></td><td><b>21.43%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L41'>41</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L45'>45</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L51'>51</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L51-L52'>51&ndash;52</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L55-L57'>55&ndash;57</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L59'>59</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L59-L61'>59&ndash;61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L61'>61</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L61-L63'>61&ndash;63</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L65'>65</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L65-L67'>65&ndash;67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L67'>67</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L67-L68'>67&ndash;68</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L73'>73</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L73-L74'>73&ndash;74</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L76'>76</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L78'>78</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/rotate.ts#L80-L81'>80&ndash;81</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts'>scale.ts</a></td><td><b>93.57%</b></td><td><b>92.94%</b></td><td>100%</td><td><b>93.67%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts#L129-L130'>129&ndash;130</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts#L132-L134'>132&ndash;134</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts#L148-L149'>148&ndash;149</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts#L181-L183'>181&ndash;183</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scale.ts#L42'>42</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts'>scaleSkew.ts</a></td><td><b>78.79%</b></td><td><b>64.29%</b></td><td>100%</td><td><b>85.71%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L27'>27</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L29'>29</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L31'>31</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L33'>33</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/scaleSkew.ts#L35'>35</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts'>skew.ts</a></td><td><b>91.03%</b></td><td><b>79.31%</b></td><td>100%</td><td><b>97.67%</b></td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts#L131-L132'>131&ndash;132</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts#L163-L164'>163&ndash;164</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts#L171'>171</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts#L177'>177</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/skew.ts#L179'>179</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/util.ts'>util.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/wrapWithFireEvent.ts'>wrapWithFireEvent.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/controls/wrapWithFixedAnchor.ts'>wrapWithFixedAnchor.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td colspan='6'><b>src/env</b></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/env/browser.ts'>browser.ts</a></td><td><b>84.21%</b></td><td><b>77.78%</b></td><td><b>50%</b></td><td>100%</td><td><a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/env/browser.ts#L14'>14</a>, <a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/env/browser.ts#L17'>17</a></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/env/index.ts'>index.ts</a></td><td>100%</td><td>100%</td><td>100%</td><td>100%</td><td></td></tr><tr><td>&nbsp; &nbsp;<a href='https://github.com/fabricjs/fabric.js/blob/fb99d121b5c5053e86b3efadef48e32baa3f18bb/src/env/node.ts'>node.ts</a></td><td><b>74.07%</b></td><td><b>33.33%</b></td><td><b>66.67%</b></td><td><b>88.89%</b></td><td><a href='https://github.com/fab


asturur: Great this is a bunch of work saved
I ll add an extra script to monitor coverage of jest even if we won't know the total coverage.

Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index eb33d0c95..6a624e9f3 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,7 @@
 
 ## [next]
 
+- test(Text): Add some tests for text in Jest [#9083](https://github.com/fabricjs/fabric.js/pull/9083)
 - ci(): Install system deps only when necessary [#9086](https://github.com/fabricjs/fabric.js/pull/9086)
 - fix(util, Path): path distance measurement fix for M cmd [#9076](https://github.com/fabricjs/fabric.js/pull/9076)
 - chore(TS): Image class type checks, BREAKING change to FromURL static method [#9036](https://github.com/fabricjs/fabric.js/pull/9036)
diff --git a/jest.config.js b/jest.config.js
index c3ab6d82b..4a7d66ce3 100644
--- a/jest.config.js
+++ b/jest.config.js
@@ -3,6 +3,9 @@
  * https://jestjs.io/docs/configuration
  */
 
+/**
+ * @type {import ("jest").Config}
+ */
 module.exports = {
   // All imported modules in your tests should be mocked automatically
   // automock: false,
diff --git a/rollup.config.mjs b/rollup.config.mjs
index 125414bbd..a2974ae4b 100644
--- a/rollup.config.mjs
+++ b/rollup.config.mjs
@@ -18,6 +18,7 @@ const plugins = [
   ts({
     noForceEmit: true,
     tsconfig: './tsconfig.json',
+    exclude: ['dist', '**/**.spec.ts', '**/**.test.ts'],
   }),
   babel({
     extensions: ['.ts', '.js'],
@@ -39,7 +40,7 @@ function onwarn(warning, warn) {
       !warning.message.includes('sourcemap')) ||
     warning.code === 'CIRCULAR_DEPENDENCY'
   ) {
-    console.error(chalk.redBright(warning.message));
+    console.error(chalk.redBright(warning));
     if (process.env.CI) {
       throw Object.assign(new Error(), warning);
     }
diff --git a/src/shapes/IText/IText.ts b/src/shapes/IText/IText.ts
index d19c218bf..cb52c6c9f 100644
--- a/src/shapes/IText/IText.ts
+++ b/src/shapes/IText/IText.ts
@@ -17,6 +17,7 @@ import {
   JUSTIFY_RIGHT,
 } from '../Text/constants';
 import { CENTER, LEFT, RIGHT } from '../../constants';
+import type { TProps } from '../Object/types';
 
 type CursorBoundaries = {
   left: number;
@@ -103,7 +104,7 @@ export interface ITextProps extends TextProps, UniqueITextProps {}
  * ```
  */
 export class IText<
-    Props extends ITextProps = ITextProps,
+    Props extends TProps<ITextProps> = Partial<ITextProps>,
     SProps extends SerializedITextProps = SerializedITextProps,
     EventSpec extends ITextEvents = ITextEvents
   >
@@ -216,7 +217,7 @@ export class IText<
    * @param {String} text Text string
    * @param {Object} [options] Options object
    */
-  constructor(text: string, options: object) {
+  constructor(text: string, options?: Props) {
     super(text, options);
     this.initBehavior();
   }
diff --git a/src/shapes/Text/Text.spec.ts b/src/shapes/Text/Text.spec.ts
new file mode 100644
index 000000000..cadc374c9
--- /dev/null
+++ b/src/shapes/Text/Text.spec.ts
@@ -0,0 +1,73 @@
+import '../../../toMatchRoundedSnapshot';
+import { cache } from '../../cache';
+import { config } from '../../config';
+import { Text } from './Text';
+
+afterEach(() => {
+  config.restoreDefaults();
+});
+
+describe('Text', () => {
+  it('toObject', async () => {
+    expect(new Text('text').toObject()).toMatchRoundedSnapshot(['width']);
+  });
+
+  it('fromObject', async () => {
+    expect((await Text.fromObject({ text: 'text' })).toObject()).toEqual(
+      new Text('text').toObject()
+    );
+  });
+
+  describe('measuring, splitting', () => {
+    it('measuring', () => {
+      cache.clearFontCache();
+      const zwc = '\u200b';
+      const text = new Text('');
+      const style = text.getCompleteStyleDeclaration(0, 0);
+      const measurement = text._measureChar('a', style, zwc, style);
+      expect(measurement).toMatchRoundedSnapshot();
+      expect(measurement).toEqual(text._measureChar('a', style, zwc, style));
+    });
+
+    it('splits into lines', () => {
+      const text = new Text('test foo bar-baz\nqux');
+      expect(text._splitTextIntoLines(text.text)).toMatchSnapshot();
+    });
+  });
+
+  it('toSVG with NUM_FRACTION_DIGITS', async () => {
+    const text = await Text.fromObject({
+      text: 'xxxxxx',
+      styles: [
+        { fill: 'red' },
+        { fill: 'blue' },
+        { fill: 'green' },
+        { fill: 'yellow' },
+        { fill: 'pink' },
+      ].map((style, index) => ({ style, start: index, end: index + 1 })),
+    });
+    config.configure({ NUM_FRACTION_DIGITS: 1 });
+    expect(text.toSVG()).toMatchSnapshot();
+    config.configure({ NUM_FRACTION_DIGITS: 3 });
+    expect(text.toSVG()).toMatchSnapshot();
+  });
+
+  it('subscript/superscript', async () => {
+    const text = await Text.fromObject({
+      text: 'xxxxxx',
+      styles: [
+        { stroke: 'black', fill: 'blue' },
+        { fill: 'blue' },
+        { fontSize: 4, deltaY: 20 },
+        { stroke: 'black', fill: 'blue' },
+        { fill: 'blue' },
+        { fontSize: 4, deltaY: 20 },
+      ].map((style, index) => ({ style, start: index, end: index + 1 })),
+    });
+    text.setSuperscript(1, 2);
+    text.setSuperscript(2, 3);
+    text.setSubscript(3, 4);
+    text.setSubscript(4, 5);
+    expect(text.toObject().styles).toMatchSnapshot();
+  });
+});
diff --git a/src/shapes/Text/Text.ts b/src/shapes/Text/Text.ts
index 3d95194ed..20a336b50 100644
--- a/src/shapes/Text/Text.ts
+++ b/src/shapes/Text/Text.ts
@@ -18,6 +18,7 @@ import type {
 import { classRegistry } from '../../ClassRegistry';
 import { graphemeSplit } from '../../util/lang_string';
 import { createCanvasElement } from '../../util/misc/dom';
+import type { TextStyleArray } from '../../util/misc/textStyles';
 import {
   hasStyleChanged,
   stylesFromArray,
@@ -102,9 +103,13 @@ interface UniqueTextProps {
 
 export interface SerializedTextProps
   extends SerializedObjectProps,
-    UniqueTextProps {}
+    UniqueTextProps {
+  styles: TextStyleArray | TextStyle;
+}
 
-export interface TextProps extends FabricObjectProps, UniqueTextProps {}
+export interface TextProps extends FabricObjectProps, UniqueTextProps {
+  styles: TextStyle;
+}
 
 /**
  * Text class
@@ -406,7 +411,7 @@ export class Text<
     return { ...super.getDefaults(), ...Text.ownDefaults };
   }
 
-  constructor(text: string, options: any) {
+  constructor(text: string, options: Props = {} as Props) {
     super({ ...options, text, styles: options?.styles || {} });
     this.initialized = true;
     if (this.path) {
@@ -1883,8 +1888,10 @@ export class Text<
    * @param {Object} object plain js Object to create an instance from
    * @returns {Promise<Text>}
    */
-  static fromObject<T extends TProps<SerializedTextProps>>(object: T) {
-    return this._fromObject<Text>(
+  static fromObject<T extends TProps<SerializedTextProps>, S extends Text>(
+    object: T
+  ) {
+    return this._fromObject<S>(
       {
         ...object,
         styles: stylesFromArray(object.styles || {}, object.text),
diff --git a/src/shapes/Text/__snapshots__/Text.spec.ts.snap b/src/shapes/Text/__snapshots__/Text.spec.ts.snap
new file mode 100644
index 000000000..2e408cc11
--- /dev/null
+++ b/src/shapes/Text/__snapshots__/Text.spec.ts.snap
@@ -0,0 +1,214 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Text measuring, splitting measuring 1`] = `
+{
+  "kernedWidth": 18,
+  "width": 18,
+}
+`;
+
+exports[`Text measuring, splitting splits into lines 1`] = `
+{
+  "_unwrappedLines": [
+    [
+      "t",
+      "e",
+      "s",
+      "t",
+      " ",
+      "f",
+      "o",
+      "o",
+      " ",
+      "b",
+      "a",
+      "r",
+      "-",
+      "b",
+      "a",
+      "z",
+    ],
+    [
+      "q",
+      "u",
+      "x",
+    ],
+  ],
+  "graphemeLines": [
+    [
+      "t",
+      "e",
+      "s",
+      "t",
+      " ",
+      "f",
+      "o",
+      "o",
+      " ",
+      "b",
+      "a",
+      "r",
+      "-",
+      "b",
+      "a",
+      "z",
+    ],
+    [
+      "q",
+      "u",
+      "x",
+    ],
+  ],
+  "graphemeText": [
+    "t",
+    "e",
+    "s",
+    "t",
+    " ",
+    "f",
+    "o",
+    "o",
+    " ",
+    "b",
+    "a",
+    "r",
+    "-",
+    "b",
+    "a",
+    "z",
+    "
+",
+    "q",
+    "u",
+    "x",
+  ],
+  "lines": [
+    "test foo bar-baz",
+    "qux",
+  ],
+}
+`;
+
+exports[`Text subscript/superscript 1`] = `
+[
+  {
+    "end": 1,
+    "start": 0,
+    "style": {
+      "fill": "blue",
+      "stroke": "black",
+    },
+  },
+  {
+    "end": 2,
+    "start": 1,
+    "style": {
+      "deltaY": -14,
+      "fill": "blue",
+      "fontSize": 24,
+    },
+  },
+  {
+    "end": 3,
+    "start": 2,
+    "style": {
+      "deltaY": 18.6,
+      "fontSize": 2.4,
+    },
+  },
+  {
+    "end": 4,
+    "start": 3,
+    "style": {
+      "deltaY": 4.4,
+      "fill": "blue",
+      "fontSize": 24,
+      "stroke": "black",
+    },
+  },
+  {
+    "end": 5,
+    "start": 4,
+    "style": {
+      "deltaY": 4.4,
+      "fill": "blue",
+      "fontSize": 24,
+    },
+  },
+  {
+    "end": 6,
+    "start": 5,
+    "style": {
+      "deltaY": 20,
+      "fontSize": 4,
+    },
+  },
+]
+`;
+
+exports[`Text toObject 1`] = `
+{
+  "angle": 0,
+  "backgroundColor": "",
+  "charSpacing": 0,
+  "direction": "ltr",
+  "fill": "rgb(0,0,0)",
+  "fillRule": "nonzero",
+  "flipX": false,
+  "flipY": false,
+  "fontFamily": "Times New Roman",
+  "fontSize": 40,
+  "fontStyle": "normal",
+  "fontWeight": "normal",
+  "globalCompositeOperation": "source-over",
+  "height": 45.2,
+  "left": 0,
+  "lineHeight": 1.16,
+  "linethrough": false,
+  "opacity": 1,
+  "originX": "left",
+  "originY": "top",
+  "overline": false,
+  "paintFirst": "fill",
+  "pathAlign": "baseline",
+  "pathSide": "left",
+  "pathStartOffset": 0,
+  "scaleX": 1,
+  "scaleY": 1,
+  "shadow": null,
+  "skewX": 0,
+  "skewY": 0,
+  "stroke": null,
+  "strokeDashArray": null,
+  "strokeDashOffset": 0,
+  "strokeLineCap": "butt",
+  "strokeLineJoin": "miter",
+  "strokeMiterLimit": 4,
+  "strokeUniform": false,
+  "strokeWidth": 1,
+  "styles": [],
+  "text": "text",
+  "textAlign": "left",
+  "textBackgroundColor": "",
+  "top": 0,
+  "type": "Text",
+  "underline": false,
+  "version": "6.0.0-beta10",
+  "visible": true,
+  "width": 60,
+}
+`;
+
+exports[`Text toSVG with NUM_FRACTION_DIGITS 1`] = `
+"<g transform="matrix(1 0 0 1 60.5 23.1)" style=""  >
+		<text xml:space="preserve" font-family="Times New Roman" font-size="40" font-style="normal" font-weight="normal" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;" ><tspan x="-60" y="12.6" style="fill: rgb(255,0,0); ">x</tspan><tspan x="-40" y="12.6" style="fill: rgb(0,0,255); ">x</tspan><tspan x="-20" y="12.6" style="fill: rgb(0,128,0); ">x</tspan><tspan x="0" y="12.6" style="fill: rgb(255,255,0); ">x</tspan><tspan x="20" y="12.6" style="fill: rgb(255,192,203); ">x</tspan><tspan x="40" y="12.6" >x</tspan></text>
+</g>
+"
+`;
+
+exports[`Text toSVG with NUM_FRACTION_DIGITS 2`] = `
+"<g transform="matrix(1 0 0 1 60.5 23.1)" style=""  >
+		<text xml:space="preserve" font-family="Times New Roman" font-size="40" font-style="normal" font-weight="normal" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-dashoffset: 0; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;" ><tspan x="-60" y="12.566" style="fill: rgb(255,0,0); ">x</tspan><tspan x="-40" y="12.566" style="fill: rgb(0,0,255); ">x</tspan><tspan x="-20" y="12.566" style="fill: rgb(0,128,0); ">x</tspan><tspan x="0" y="12.566" style="fill: rgb(255,255,0); ">x</tspan><tspan x="20" y="12.566" style="fill: rgb(255,192,203); ">x</tspan><tspan x="40" y="12.566" >x</tspan></text>
+</g>
+"
+`;
diff --git a/src/shapes/Textbox.spec.ts b/src/shapes/Textbox.spec.ts
new file mode 100644
index 000000000..818294000
--- /dev/null
+++ b/src/shapes/Textbox.spec.ts
@@ -0,0 +1,89 @@
+import '../../toMatchRoundedSnapshot';
+import { Textbox } from './Textbox';
+
+describe('Textbox', () => {
+  it('fromObject', async () => {
+    const textbox = await Textbox.fromObject({
+      text: 'The quick \nbrown \nfox',
+    });
+    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
+    textbox.includeDefaultValues = false;
+    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
+  });
+
+  it('toObject with styles', () => {
+    const textbox = new Textbox('The quick \nbrown \nfox', {
+      width: 120,
+      styles: {
+        '0': {
+          '5': { fill: 'red' },
+          '6': { fill: 'red' },
+          '7': { fill: 'red' },
+          '8': { fill: 'red' },
+        },
+        '1': {
+          '3': { underline: true },
+          '4': { underline: true },
+          '5': { underline: true },
+        },
+        '2': {
+          '0': { underline: true },
+          '1': { underline: true },
+        },
+      },
+    });
+    expect(textbox.toObject()).toMatchRoundedSnapshot(['width']);
+  });
+
+  it('stylesToArray edge case', () => {
+    const textbox = new Textbox('The quick \nbrown \nfox', {
+      width: 120,
+      styles: {
+        '0': {
+          '5': { fill: 'red' },
+          '6': { fill: 'red' },
+          '7': { fill: 'red' },
+          '8': { fill: 'red' },
+          '9': { fill: 'red' },
+          '10': { fill: 'red' },
+        },
+        '2': {
+          '0': { fill: 'red' },
+        },
+      },
+    });
+    expect(textbox.toObject().styles).toMatchSnapshot();
+  });
+
+  it('fromObject with styles', async () => {
+    const textbox = new Textbox('The quick \nbrown \nfox', {
+      width: 120,
+      styles: {
+        '0': {
+          '5': { fill: 'red' },
+          '6': { fill: 'red' },
+          '7': { fill: 'red' },
+          '8': { fill: 'red' },
+        },
+        '1': {
+          '3': { underline: true },
+          '4': { underline: true },
+          '5': { underline: true },
+        },
+        '2': {
+          '0': { underline: true },
+          '1': { underline: true },
+        },
+      },
+    });
+    const textbox2 = await Textbox.fromObject(textbox.toObject());
+    expect(textbox2.toObject()).toEqual(textbox.toObject());
+    expect(textbox2.styles !== textbox.styles).toBeTruthy();
+    for (const a in textbox2.styles) {
+      for (const b in textbox2.styles[a]) {
+        expect(textbox2.styles[a][b] !== textbox.styles[a][b]).toBeTruthy();
+        expect(textbox2.styles[a][b]).toEqual(textbox.styles[a][b]);
+      }
+    }
+  });
+});
diff --git a/src/shapes/Textbox.ts b/src/shapes/Textbox.ts
index 882c6e7ef..d0fd19e58 100644
--- a/src/shapes/Textbox.ts
+++ b/src/shapes/Textbox.ts
@@ -517,7 +517,7 @@ export class Textbox extends IText {
    * @param {Array} [propertiesToInclude] Any properties that you might want to additionally include in the output
    * @return {Object} object representation of an instance
    */
-  toObject(propertiesToInclude: Array<any>): object {
+  toObject(propertiesToInclude?: Array<any>) {
     return super.toObject(
       ['minWidth', 'splitByGrapheme'].concat(propertiesToInclude)
     );
diff --git a/src/shapes/__snapshots__/Textbox.spec.ts.snap b/src/shapes/__snapshots__/Textbox.spec.ts.snap
new file mode 100644
index 000000000..c2895d946
--- /dev/null
+++ b/src/shapes/__snapshots__/Textbox.spec.ts.snap
@@ -0,0 +1,164 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`Textbox fromObject 1`] = `
+{
+  "angle": 0,
+  "backgroundColor": "",
+  "charSpacing": 0,
+  "direction": "ltr",
+  "fill": "rgb(0,0,0)",
+  "fillRule": "nonzero",
+  "flipX": false,
+  "flipY": false,
+  "fontFamily": "Times New Roman",
+  "fontSize": 40,
+  "fontStyle": "normal",
+  "fontWeight": "normal",
+  "globalCompositeOperation": "source-over",
+  "height": 254.928,
+  "left": 0,
+  "lineHeight": 1.16,
+  "linethrough": false,
+  "minWidth": 20,
+  "opacity": 1,
+  "originX": "left",
+  "originY": "top",
+  "overline": false,
+  "paintFirst": "fill",
+  "pathAlign": "baseline",
+  "pathSide": "left",
+  "pathStartOffset": 0,
+  "scaleX": 1,
+  "scaleY": 1,
+  "shadow": null,
+  "skewX": 0,
+  "skewY": 0,
+  "splitByGrapheme": false,
+  "stroke": null,
+  "strokeDashArray": null,
+  "strokeDashOffset": 0,
+  "strokeLineCap": "butt",
+  "strokeLineJoin": "miter",
+  "strokeMiterLimit": 4,
+  "strokeUniform": false,
+  "strokeWidth": 1,
+  "styles": [],
+  "text": "The quick 
+brown 
+fox",
+  "textAlign": "left",
+  "textBackgroundColor": "",
+  "top": 0,
+  "type": "Textbox",
+  "underline": false,
+  "version": "6.0.0-beta10",
+  "visible": true,
+  "width": 102,
+}
+`;
+
+exports[`Textbox fromObject 2`] = `
+{
+  "height": 254.928,
+  "left": 0,
+  "styles": [],
+  "text": "The quick 
+brown 
+fox",
+  "top": 0,
+  "type": "Textbox",
+  "version": "6.0.0-beta10",
+  "width": 102,
+}
+`;
+
+exports[`Textbox stylesToArray edge case 1`] = `
+[
+  {
+    "end": 10,
+    "start": 5,
+    "style": {
+      "fill": "red",
+    },
+  },
+  {
+    "end": 17,
+    "start": 16,
+    "style": {
+      "fill": "red",
+    },
+  },
+]
+`;
+
+exports[`Textbox toObject with styles 1`] = `
+{
+  "angle": 0,
+  "backgroundColor": "",
+  "charSpacing": 0,
+  "direction": "ltr",
+  "fill": "rgb(0,0,0)",
+  "fillRule": "nonzero",
+  "flipX": false,
+  "flipY": false,
+  "fontFamily": "Times New Roman",
+  "fontSize": 40,
+  "fontStyle": "normal",
+  "fontWeight": "normal",
+  "globalCompositeOperation": "source-over",
+  "height": 202.496,
+  "left": 0,
+  "lineHeight": 1.16,
+  "linethrough": false,
+  "minWidth": 20,
+  "opacity": 1,
+  "originX": "left",
+  "originY": "top",
+  "overline": false,
+  "paintFirst": "fill",
+  "pathAlign": "baseline",
+  "pathSide": "left",
+  "pathStartOffset": 0,
+  "scaleX": 1,
+  "scaleY": 1,
+  "shadow": null,
+  "skewX": 0,
+  "skewY": 0,
+  "splitByGrapheme": false,
+  "stroke": null,
+  "strokeDashArray": null,
+  "strokeDashOffset": 0,
+  "strokeLineCap": "butt",
+  "strokeLineJoin": "miter",
+  "strokeMiterLimit": 4,
+  "strokeUniform": false,
+  "strokeWidth": 1,
+  "styles": [
+    {
+      "end": 9,
+      "start": 5,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 18,
+      "start": 13,
+      "style": {
+        "underline": true,
+      },
+    },
+  ],
+  "text": "The quick 
+brown 
+fox",
+  "textAlign": "left",
+  "textBackgroundColor": "",
+  "top": 0,
+  "type": "Textbox",
+  "underline": false,
+  "version": "6.0.0-beta10",
+  "visible": true,
+  "width": 120,
+}
+`;
diff --git a/toMatchRoundedSnapshot.ts b/toMatchRoundedSnapshot.ts
new file mode 100644
index 000000000..e50463d4c
--- /dev/null
+++ b/toMatchRoundedSnapshot.ts
@@ -0,0 +1,66 @@
+/* eslint-disable @typescript-eslint/no-namespace */
+import { expect } from '@jest/globals';
+import { toMatchSnapshot } from 'jest-snapshot';
+import { cloneDeep } from './src/util/internals/cloneDeep';
+
+// https://github.com/jestjs/jest/blob/70b17d2e3d2bf40dd27fecdcdd06c159d26a7c6c/website/versioned_docs/version-25.x/ExpectAPI.md?plain=1#L241-L262
+
+function roundDeep(received: any, key: string | number) {
+  const value = received[key];
+  Array.isArray(value)
+    ? value.forEach((entry, index, array) => roundDeep(array, index))
+    : typeof value === 'object'
+    ? Object.keys(value).forEach((key) => roundDeep(value, key))
+    : typeof value === 'number' && (received[key] = Math.round(value));
+}
+
+expect.extend({
+  toMatchRoundedSnapshot(
+    received: Record<string, unknown>,
+    keys?: string[],
+    ...propertiesOrHint
+  ) {
+    const clone = cloneDeep(received);
+    (keys ?? Object.keys(clone)).forEach((key) => {
+      roundDeep(clone, key);
+    });
+    return toMatchSnapshot.call(this, clone, ...propertiesOrHint);
+  },
+});
+
+// // written in official docs but DOESN'T work
+// declare module 'expect' {
+//   interface AsymmetricMatchers {
+//     toMatchRoundedSnapshot(
+//       keys?: string[],
+//       propertiesOrHint?: object | string,
+//       hint?: string
+//     ): void;
+//   }
+//   interface Matchers<R, T> {
+//     toMatchRoundedSnapshot(
+//       keys?: (keyof T)[],
+//       propertiesOrHint?: object | string,
+//       hint?: string
+//     ): R;
+//   }
+// }
+// not written in official docs but DOES work
+declare global {
+  namespace jest {
+    interface AsymmetricMatchers {
+      toMatchRoundedSnapshot(
+        keys?: string[],
+        propertiesOrHint?: object | string,
+        hint?: string
+      ): void;
+    }
+    interface Matchers<R, T> {
+      toMatchRoundedSnapshot(
+        keys?: (keyof T)[],
+        propertiesOrHint?: object | string,
+        hint?: string
+      ): R;
+    }
+  }
+}


Test patch:
diff --git a/src/shapes/IText/ITextBehavior.test.ts b/src/shapes/IText/ITextBehavior.test.ts
new file mode 100644
index 000000000..ea81de8e6
--- /dev/null
+++ b/src/shapes/IText/ITextBehavior.test.ts
@@ -0,0 +1,93 @@
+import '../../../toMatchRoundedSnapshot';
+import { IText } from './IText';
+
+export function matchTextStateSnapshot(text: IText) {
+  const {
+    styles,
+    _text: t,
+    _textLines: lines,
+    __charBounds: charBounds,
+  } = text;
+
+  expect({
+    styles,
+    text: t,
+    lines,
+    charBounds,
+  }).toMatchRoundedSnapshot();
+  text.includeDefaultValues = false;
+  expect(text.toObject()).toMatchRoundedSnapshot(['width']);
+}
+
+function create() {
+  return IText.fromObject<any, IText>({
+    text: 'test',
+    fontSize: 25,
+    styles: [
+      { fill: 'red' },
+      { fill: 'yellow' },
+      { fill: 'blue' },
+      { fill: 'green' },
+    ].map((style, index) => ({ style, start: index, end: index + 1 })),
+  });
+}
+
+describe('text imperative changes', () => {
+  it('removeChars', async () => {
+    const iText = await create();
+    iText.removeChars(1, 3);
+    expect(iText.text).toBe('tt');
+    matchTextStateSnapshot(iText);
+  });
+
+  it('insertChars', async () => {
+    const iText = await create();
+    iText.insertChars('ab', undefined, 1);
+    expect(iText.text).toBe('tabest');
+    matchTextStateSnapshot(iText);
+  });
+
+  it('insertChars and removes chars', async () => {
+    const iText = await create();
+    iText.insertChars('ab', undefined, 1, 2);
+    expect(iText.text).toBe('tabst');
+    matchTextStateSnapshot(iText);
+  });
+
+  it('insertChars and removes chars', async () => {
+    const iText = await create();
+    iText.insertChars('ab', undefined, 1, 4);
+    expect(iText.text).toBe('tab');
+    matchTextStateSnapshot(iText);
+  });
+
+  it('insertChars handles new lines correctly', async () => {
+    const iText = await create();
+    iText.insertChars('ab\n\n', undefined, 1);
+    matchTextStateSnapshot(iText);
+  });
+
+  it('insertChars can accept some style for the new text', async () => {
+    const iText = await create();
+    iText.insertChars(
+      'ab\n\na',
+      [
+        { fill: 'col1' },
+        { fill: 'col2' },
+        { fill: 'col3' },
+        { fill: 'col4' },
+        { fill: 'col5' },
+      ],
+      1
+    );
+    matchTextStateSnapshot(iText);
+  });
+
+  it('missingNewlineOffset', () => {
+    const iText = new IText(
+      '由石墨\n分裂的石墨分\n裂\n由石墨分裂由石墨分裂的石\n墨分裂'
+    );
+
+    expect(iText.missingNewlineOffset(0)).toBe(1);
+  });
+});
diff --git a/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap b/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap
new file mode 100644
index 000000000..b7fea48d8
--- /dev/null
+++ b/src/shapes/IText/__snapshots__/ITextBehavior.test.ts.snap
@@ -0,0 +1,810 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`text imperative changes insertChars 1`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 7,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 13,
+        "left": 18,
+        "width": 13,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 31,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 10,
+        "left": 42,
+        "width": 10,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 51,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 58,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "a",
+      "b",
+      "e",
+      "s",
+      "t",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "red",
+      },
+      "2": {
+        "fill": "red",
+      },
+      "3": {
+        "fill": "yellow",
+      },
+      "4": {
+        "fill": "blue",
+      },
+      "5": {
+        "fill": "green",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "a",
+    "b",
+    "e",
+    "s",
+    "t",
+  ],
+}
+`;
+
+exports[`text imperative changes insertChars 2`] = `
+{
+  "fontSize": 25,
+  "height": 28.25,
+  "left": 0,
+  "styles": [
+    {
+      "end": 3,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 4,
+      "start": 3,
+      "style": {
+        "fill": "yellow",
+      },
+    },
+    {
+      "end": 5,
+      "start": 4,
+      "style": {
+        "fill": "blue",
+      },
+    },
+    {
+      "end": 6,
+      "start": 5,
+      "style": {
+        "fill": "green",
+      },
+    },
+  ],
+  "text": "tabest",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 58,
+}
+`;
+
+exports[`text imperative changes insertChars and removes chars 1`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 7,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 13,
+        "left": 18,
+        "width": 13,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 10,
+        "left": 31,
+        "width": 10,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 40,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 47,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "a",
+      "b",
+      "s",
+      "t",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "red",
+      },
+      "2": {
+        "fill": "red",
+      },
+      "3": {
+        "fill": "blue",
+      },
+      "4": {
+        "fill": "green",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "a",
+    "b",
+    "s",
+    "t",
+  ],
+}
+`;
+
+exports[`text imperative changes insertChars and removes chars 2`] = `
+{
+  "fontSize": 25,
+  "height": 28.25,
+  "left": 0,
+  "styles": [
+    {
+      "end": 3,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 4,
+      "start": 3,
+      "style": {
+        "fill": "blue",
+      },
+    },
+    {
+      "end": 5,
+      "start": 4,
+      "style": {
+        "fill": "green",
+      },
+    },
+  ],
+  "text": "tabst",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 47,
+}
+`;
+
+exports[`text imperative changes insertChars and removes chars 3`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 7,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 13,
+        "left": 18,
+        "width": 13,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 31,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "a",
+      "b",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "red",
+      },
+      "2": {
+        "fill": "red",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "a",
+    "b",
+  ],
+}
+`;
+
+exports[`text imperative changes insertChars and removes chars 4`] = `
+{
+  "fontSize": 25,
+  "height": 28.25,
+  "left": 0,
+  "styles": [
+    {
+      "end": 3,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+  ],
+  "text": "tab",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 31,
+}
+`;
+
+exports[`text imperative changes insertChars can accept some style for the new text 1`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 7,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 13,
+        "left": 18,
+        "width": 13,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 31,
+        "width": 0,
+      },
+    ],
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 0,
+        "width": 0,
+      },
+    ],
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 0,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 11,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 10,
+        "left": 22,
+        "width": 10,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 32,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 39,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "a",
+      "b",
+    ],
+    [],
+    [
+      "a",
+      "e",
+      "s",
+      "t",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "col1",
+      },
+      "2": {
+        "fill": "col2",
+      },
+    },
+    "1": {
+      "0": {
+        "fill": "col4",
+      },
+    },
+    "2": {
+      "0": {
+        "fill": "col5",
+      },
+      "1": {
+        "fill": "yellow",
+      },
+      "2": {
+        "fill": "blue",
+      },
+      "3": {
+        "fill": "green",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "a",
+    "b",
+    "
+",
+    "
+",
+    "a",
+    "e",
+    "s",
+    "t",
+  ],
+}
+`;
+
+exports[`text imperative changes insertChars can accept some style for the new text 2`] = `
+{
+  "fontSize": 25,
+  "height": 93.79,
+  "left": 0,
+  "styles": [
+    {
+      "end": 1,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 2,
+      "start": 1,
+      "style": {
+        "fill": "col1",
+      },
+    },
+    {
+      "end": 3,
+      "start": 2,
+      "style": {
+        "fill": "col2",
+      },
+    },
+    {
+      "end": 4,
+      "start": 3,
+      "style": {
+        "fill": "col5",
+      },
+    },
+    {
+      "end": 5,
+      "start": 4,
+      "style": {
+        "fill": "yellow",
+      },
+    },
+    {
+      "end": 6,
+      "start": 5,
+      "style": {
+        "fill": "blue",
+      },
+    },
+    {
+      "end": 7,
+      "start": 6,
+      "style": {
+        "fill": "green",
+      },
+    },
+  ],
+  "text": "tab
+
+aest",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 39,
+}
+`;
+
+exports[`text imperative changes insertChars handles new lines correctly 1`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 7,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 13,
+        "left": 18,
+        "width": 13,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 31,
+        "width": 0,
+      },
+    ],
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 0,
+        "width": 0,
+      },
+    ],
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 11,
+        "left": 0,
+        "width": 11,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 10,
+        "left": 11,
+        "width": 10,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 21,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 28,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "a",
+      "b",
+    ],
+    [],
+    [
+      "e",
+      "s",
+      "t",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "red",
+      },
+      "2": {
+        "fill": "red",
+      },
+    },
+    "1": {
+      "0": {
+        "fill": "red",
+      },
+    },
+    "2": {
+      "0": {
+        "fill": "yellow",
+      },
+      "1": {
+        "fill": "blue",
+      },
+      "2": {
+        "fill": "green",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "a",
+    "b",
+    "
+",
+    "
+",
+    "e",
+    "s",
+    "t",
+  ],
+}
+`;
+
+exports[`text imperative changes insertChars handles new lines correctly 2`] = `
+{
+  "fontSize": 25,
+  "height": 93.79,
+  "left": 0,
+  "styles": [
+    {
+      "end": 3,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 4,
+      "start": 3,
+      "style": {
+        "fill": "yellow",
+      },
+    },
+    {
+      "end": 5,
+      "start": 4,
+      "style": {
+        "fill": "blue",
+      },
+    },
+    {
+      "end": 6,
+      "start": 5,
+      "style": {
+        "fill": "green",
+      },
+    },
+  ],
+  "text": "tab
+
+est",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 31,
+}
+`;
+
+exports[`text imperative changes removeChars 1`] = `
+{
+  "charBounds": [
+    [
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 0,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 7,
+        "left": 7,
+        "width": 7,
+      },
+      {
+        "deltaY": 0,
+        "height": 25,
+        "kernedWidth": 0,
+        "left": 14,
+        "width": 0,
+      },
+    ],
+  ],
+  "lines": [
+    [
+      "t",
+      "t",
+    ],
+  ],
+  "styles": {
+    "0": {
+      "0": {
+        "fill": "red",
+      },
+      "1": {
+        "fill": "green",
+      },
+    },
+  },
+  "text": [
+    "t",
+    "t",
+  ],
+}
+`;
+
+exports[`text imperative changes removeChars 2`] = `
+{
+  "fontSize": 25,
+  "height": 28.25,
+  "left": 0,
+  "styles": [
+    {
+      "end": 1,
+      "start": 0,
+      "style": {
+        "fill": "red",
+      },
+    },
+    {
+      "end": 2,
+      "start": 1,
+      "style": {
+        "fill": "green",
+      },
+    },
+  ],
+  "text": "tt",
+  "top": 0,
+  "type": "IText",
+  "version": "6.0.0-beta10",
+  "width": 14,
+}
+`;
diff --git a/test/unit/canvas_static.js b/test/unit/canvas_static.js
index 427ba42bd..5b4aa08fe 100644
--- a/test/unit/canvas_static.js
+++ b/test/unit/canvas_static.js
@@ -1310,7 +1310,7 @@
 
   QUnit.test('loadFromJSON with text', function(assert) {
     var done = assert.async();
-    var json = '{"objects":[{"type":"Text","left":150,"top":200,"width":128,"height":64.32,"fill":"#000000","stroke":"","strokeWidth":"","scaleX":0.8,"scaleY":0.8,"angle":0,"flipX":false,"flipY":false,"opacity":1,"text":"NAME HERE","fontSize":24,"fontWeight":"","fontFamily":"Delicious_500","fontStyle":"","lineHeight":"","textDecoration":"","textAlign":"center","path":"","strokeStyle":"","backgroundColor":""}],"background":"#ffffff"}';
+    var json = '{"objects":[{"type":"Text","left":150,"top":200,"width":128,"height":64.32,"fill":"#000000","stroke":"","strokeWidth":"","scaleX":0.8,"scaleY":0.8,"angle":0,"flipX":false,"flipY":false,"opacity":1,"text":"NAME HERE","fontSize":24,"fontWeight":"normal","fontFamily":"Delicious_500","fontStyle":"normal","lineHeight":"","textDecoration":"","textAlign":"center","path":"","strokeStyle":"","backgroundColor":""}],"background":"#ffffff"}';
     canvas.loadFromJSON(json).then(function() {
 
       canvas.renderAll();
@@ -1327,7 +1327,7 @@
   QUnit.test('loadFromJSON with clipPath', function(assert) {
     var done = assert.async();
     var canvas3 = new fabric.StaticCanvas();
-    var json = '{"clipPath": {"type":"Text","left":150,"top":200,"width":128,"height":64.32,"fill":"#000000","stroke":"","strokeWidth":"","scaleX":0.8,"scaleY":0.8,"angle":0,"flipX":false,"flipY":false,"opacity":1,"text":"NAME HERE","fontSize":24,"fontWeight":"","fontFamily":"Delicious_500","fontStyle":"","lineHeight":"","textDecoration":"","textAlign":"center","path":"","strokeStyle":"","backgroundColor":""}}';
+    var json = '{"clipPath": {"type":"Text","left":150,"top":200,"width":128,"height":64.32,"fill":"#000000","stroke":"","strokeWidth":"","scaleX":0.8,"scaleY":0.8,"angle":0,"flipX":false,"flipY":false,"opacity":1,"text":"NAME HERE","fontSize":24,"fontWeight":"normal","fontFamily":"Delicious_500","fontStyle":"normal","lineHeight":"","textDecoration":"","textAlign":"center","path":"","strokeStyle":"","backgroundColor":""}}';
     canvas3.loadFromJSON(json).then(function() {
       assert.ok(canvas3.clipPath instanceof fabric.Text);
       assert.equal(canvas3.clipPath.constructor.type, 'Text');
diff --git a/test/unit/itext_key_behaviour.js b/test/unit/itext_key_behaviour.js
index 3df80fae6..22b0c5896 100644
--- a/test/unit/itext_key_behaviour.js
+++ b/test/unit/itext_key_behaviour.js
@@ -345,77 +345,5 @@
       fabric.config.configure({ disableStyleCopyPaste: false });
     });
 
-    QUnit.test('removeChars', function(assert) {
-      var iText = new fabric.IText('test', { fontSize: 25, styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'blue' }}}});
-      assert.ok(typeof iText.removeChars === 'function');
-      iText.removeChars(1,3);
-      assert.equal(iText.text, 'tt', 'text has been removed');
-      assert.deepEqual(iText._text, ['t','t'], 'text has been removed');
-      assert.equal(iText.styles[0][1], undefined, 'style has been removed');
-    });
-
-    QUnit.test('insertChars', function(assert) {
-      var iText = new fabric.IText('test');
-      assert.ok(typeof iText.insertChars === 'function');
-      iText.insertChars('ab', null, 1);
-      assert.equal(iText.text, 'tabest', 'text has been added');
-      assert.deepEqual(iText._text.join(''), 'tabest', '_text has been updated');
-    });
-
-    QUnit.test('insertChars can remove chars', function(assert) {
-      var iText = new fabric.IText('test');
-      iText.insertChars('ab', null, 1, 2);
-      assert.equal(iText.text, 'tabst', 'text has added');
-      assert.deepEqual(iText._text.join(''), 'tabst', '_text has been updated');
-      var iText = new fabric.IText('test');
-      iText.insertChars('ab', null, 1, 4);
-      assert.equal(iText.text, 'tab', 'text has added');
-      assert.deepEqual(iText._text.join(''), 'tab', '_text has been updated');
-    });
-
-    QUnit.test('insertChars pick up the style of the character behind and replicates it', function(assert) {
-      var iText = new fabric.IText('test', { fontSize: 25, styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'blue' }}}});
-      iText.insertChars('ab', null, 1);
-      assert.equal(iText.styles[0][0].fill, 'red', 'style 0 0 did not change');
-      assert.equal(iText.styles[0][1].fill, 'red', 'style 0 1 has been inserted red');
-      assert.equal(iText.styles[0][2].fill, 'red', 'style 0 2 has been inserted red');
-      assert.equal(iText.styles[0][3].fill, 'blue', 'style 0 3 was the old blue moved 2 char later');
-    });
-
-    QUnit.test('insertChars removes style from the removed text', function(assert) {
-      var iText = new fabric.IText('test', { fontSize: 25, styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'blue' }}}});
-      iText.insertChars('ab', null, 1, 2);
-      assert.equal(iText.styles[0][0].fill, 'red', 'style 0 0 did not change');
-      assert.equal(iText.styles[0][1].fill, 'red', 'style 0 1 has been inserted red');
-      assert.equal(iText.styles[0][2].fill, 'red', 'style 0 2 has been inserted red');
-      assert.equal(iText.styles[0][3], undefined, 'style 0 3 has been removed');
-    });
-
-    QUnit.test('insertChars handles new lines correctly', function(assert) {
-      var iText = new fabric.IText('test', { fontSize: 25, styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'blue' }}}});
-      iText.insertChars('ab\n\n', null, 1);
-      assert.equal(iText.styles[0][0].fill, 'red', 'style 0 0 did not change');
-      assert.equal(iText.styles[0][1].fill, 'red', 'style 0 1 has been inserted red');
-      assert.equal(iText.styles[0][2].fill, 'red', 'style 0 2 has been inserted red');
-      assert.equal(iText.styles[2][0].fill, 'blue', 'blue has been moved down');
-    });
-
-    QUnit.test('insertChars can accept some style for the new text', function(assert) {
-      var iText = new fabric.IText('test', { fontSize: 25, styles: { 0: { 0: { fill: 'red' }, 1: { fill: 'blue' }}}});
-      iText.insertChars('ab\n\na', [{ fill: 'col1'},{ fill: 'col2'},{ fill: 'col3'},{ fill: 'col4'},{ fill: 'col5'}], 1);
-      assert.equal(iText.styles[0][0].fill, 'red', 'style 0 0 did not change');
-      assert.equal(iText.styles[0][1].fill, 'col1', 'style 0 1 has been inserted col1');
-      assert.equal(iText.styles[0][2].fill, 'col2', 'style 0 2 has been inserted col2');
-      assert.equal(iText.styles[1][0].fill, 'col4', 'style 1 0 has been inserted col4');
-      assert.equal(iText.styles[2][0].fill, 'col5', 'style 2 0 has been inserted col5');
-      assert.equal(iText.styles[2][1].fill, 'blue', 'style 2 1 has been inserted blue');
-    });
-
-    QUnit.test('missingNewlineOffset', function(assert) {
-      var iText = new fabric.IText('由石墨\n分裂的石墨分\n裂\n由石墨分裂由石墨分裂的石\n墨分裂');
-
-      var offset = iText.missingNewlineOffset(0);
-      assert.equal(offset, 1, 'it returns always 1');
-    });
   });
 })();
diff --git a/test/unit/text.js b/test/unit/text.js
index 16661aafe..0c1070cb1 100644
--- a/test/unit/text.js
+++ b/test/unit/text.js
@@ -120,12 +120,6 @@
     });
   });
 
-  QUnit.test('toObject', function(assert) {
-    var text = createTextObject();
-    assert.ok(typeof text.toObject === 'function');
-    assert.deepEqual(text.toObject(), REFERENCE_TEXT_OBJECT);
-  });
-
   QUnit.test('complexity', function(assert) {
     var text = createTextObject();
     assert.ok(typeof text.complexity === 'function');
@@ -193,15 +187,6 @@
     assert.deepEqual(br, br2, 'text bounding box is the same before and after calling setCoords');
   });
 
-  QUnit.test('fabric.Text.fromObject', function(assert) {
-    var done = assert.async();
-    assert.ok(typeof fabric.Text.fromObject === 'function');
-    fabric.Text.fromObject(REFERENCE_TEXT_OBJECT).then(function(text) {
-      assert.deepEqual(text.toObject(), REFERENCE_TEXT_OBJECT);
-      done();
-    });
-  });
-
   QUnit.test('fabric.Text.fromElement', function(assert) {
     assert.ok(typeof fabric.Text.fromElement === 'function');
 
@@ -547,15 +532,6 @@
     assert.deepEqual(iText.getStyleAtPosition(18), { fill: 'green' });
   });
 
-  QUnit.test('_splitText', function(assert) {
-    var text = new fabric.Text('test foo bar-baz\nqux', {});
-    var test = text._splitText();
-    assert.equal(test.lines[0], 'test foo bar-baz', 'first line is correct');
-    assert.equal(test.lines[1], 'qux', 'second line is correct');
-    assert.deepEqual(test.graphemeLines[0], ['t','e','s','t',' ','f','o','o',' ','b','a','r','-','b','a','z'], 'first line is correct');
-    assert.deepEqual(test.graphemeLines[1], ['q','u','x'], 'second line is correct');
-  });
-
   QUnit.test('getStyleAtPosition complete', function(assert) {
     var iText = new fabric.Text('test foo bar-baz\nqux', {
       styles: {
@@ -609,42 +585,6 @@
     assert.deepEqual(iText.getStyleAtPosition(2, true), expectedStyle2, 'styles do match at 2');
   });
 
-  QUnit.test('toSVG with NUM_FRACTION_DIGITS', function(assert) {
-    var iText = new fabric.IText('test foo bar-baz', {
-      // makes weird numbers
-      styles: {
-        0: {
-          0: {
-            fill: 'red',
-          },
-          1: {
-            fill: 'blue',
-          },
-          2: {
-            fill: 'green',
-          },
-          3: {
-            fill: 'yellow',
-          },
-          4: {
-            fill: 'pink',
-          },
-        }
-      }
-    });
-    fabric.config.configure({ NUM_FRACTION_DIGITS: 1 });
-    var SVG_1 = iText.toSVG();
-    // var SVG_1_EXPECTED = '\t<g transform="translate(124.5 23.1)">\n\t\t<text xml:space="preserve" font-family="Times New Roman" font-size="40" font-style="normal" font-weight="normal" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;" ><tspan x="-124" y="12.6" style="fill: rgb(255,0,0); ">t</tspan><tspan x="-112.9" y="12.6" style="fill: rgb(0,0,255); ">e</tspan><tspan x="-95.1" y="12.6" style="fill: rgb(0,128,0); ">s</tspan><tspan x="-79.6" y="12.6" style="fill: rgb(255,255,0); ">t</tspan><tspan x="-68.4" y="12.6" style="fill: rgb(255,192,203); white-space: pre; "> </tspan><tspan x="-58.4" y="12.6" >foo bar-baz</tspan></text>\n\t</g>\n';
-    //assert.equal(SVG_1, SVG_1_EXPECTED, 'numbers have max 1 decimal');
-    fabric.config.configure({ NUM_FRACTION_DIGITS: 3 });
-    var SVG_2 = iText.toSVG();
-    // var SVG_2_EXPECTED = '\t<g transform="translate(124.484 23.1)">\n\t\t<text xml:space="preserve" font-family="Times New Roman" font-size="40" font-style="normal" font-weight="normal" style="stroke: none; stroke-width: 1; stroke-dasharray: none; stroke-linecap: butt; stroke-linejoin: miter; stroke-miterlimit: 4; fill: rgb(0,0,0); fill-rule: nonzero; opacity: 1; white-space: pre;" ><tspan x="-123.984" y="12.566" style="fill: rgb(255,0,0); ">t</tspan><tspan x="-112.871" y="12.566" style="fill: rgb(0,0,255); ">e</tspan><tspan x="-95.117" y="12.566" style="fill: rgb(0,128,0); ">s</tspan><tspan x="-79.551" y="12.566" style="fill: rgb(255,255,0); ">t</tspan><tspan x="-68.438" y="12.566" style="fill: rgb(255,192,203); white-space: pre; "> </tspan><tspan x="-58.438" y="12.566" >foo bar-baz</tspan></text>\n\t</g>\n';
-    //assert.equal(SVG_2, SVG_2_EXPECTED, 'numbers have max 3 decimal');
-    assert.ok(SVG_2.length > SVG_1.length, 'SVG 2 has more decimal');
-    // put back to 2 or break all tests
-    fabric.config.configure({ NUM_FRACTION_DIGITS: 2 });
-  });
-
   QUnit.test('getSvgSpanStyles produces correct output', function(assert) {
     var iText = new fabric.IText('test foo bar-baz');
     var styleObject = {
@@ -712,52 +652,6 @@
     assert.equal(styleString, expected, 'style is as expected with overline underline');
   });
 
-  QUnit.test('text superscript', function(assert) {
-    var text = new fabric.Text('xxx', { styles: {
-      0: { 0: { stroke: 'black', fill: 'blue' }, 1:  { fill: 'blue' }, 2:  { fontSize: 4, deltaY: 20 }}
-    } });
-    assert.ok(typeof text.setSuperscript === 'function');
-
-    var size = text.fontSize;
-    var schema = text.superscript;
-    var styleFontSize = text.styles[0][2].fontSize;
-    var styleDeltaY = text.styles[0][2].deltaY;
-    text.setSuperscript(1, 2);
-    text.setSuperscript(2, 3);
-
-    assert.equal(text.styles[0][0].fontSize, undefined, 'character 0: fontSize is not set');
-    assert.equal(text.styles[0][0].deltaY, undefined, 'character 0: deltaY is not set');
-
-    assert.equal(text.styles[0][1].fontSize, size * schema.size, 'character 1: fontSize has been set');
-    assert.equal(text.styles[0][1].deltaY, size * schema.baseline, 'character 1: deltaY has been set');
-
-    assert.equal(text.styles[0][2].fontSize, styleFontSize * schema.size, 'character 2: fontSize has been decreased');
-    assert.equal(text.styles[0][2].deltaY, styleDeltaY + styleFontSize * schema.baseline, 'character 2: deltaY has been decreased');
-  });
-
-  QUnit.test('text subscript', function(assert) {
-    var text = new fabric.Text('xxx', { styles: {
-      0: { 0: { stroke: 'black', fill: 'blue' }, 1:  { fill: 'blue' }, 2:  { fontSize: 4, deltaY: 20 }}
-    } });
-    assert.ok(typeof text.setSubscript === 'function');
-
-    var size = text.fontSize;
-    var schema = text.subscript;
-    var styleFontSize = text.styles[0][2].fontSize;
-    var styleDeltaY = text.styles[0][2].deltaY;
-    text.setSubscript(1, 2);
-    text.setSubscript(2, 3);
-
-    assert.equal(text.styles[0][0].fontSize, undefined, 'character 0: fontSize is not set');
-    assert.equal(text.styles[0][0].deltaY, undefined, 'character 0: deltaY is not set');
-
-    assert.equal(text.styles[0][1].fontSize, size * schema.size, 'character 1: fontSize has been set');
-    assert.equal(text.styles[0][1].deltaY, size * schema.baseline, 'character 1: deltaY has been set');
-
-    assert.equal(text.styles[0][2].fontSize, styleFontSize * schema.size, 'character 2: fontSize has been decreased');
-    assert.equal(text.styles[0][2].deltaY, styleDeltaY + styleFontSize * schema.baseline, 'character 2: deltaY has been increased');
-  });
-
   QUnit.test('getHeightOfLine measures height of aline', function(assert) {
     var text = new fabric.Text('xxx\n');
     var height1 = text.getHeightOfLine(0);
diff --git a/test/unit/textbox.js b/test/unit/textbox.js
index 5db9078e7..a4e174111 100644
--- a/test/unit/textbox.js
+++ b/test/unit/textbox.js
@@ -11,70 +11,6 @@
       canvas.clear();
     }
   });
-  var TEXTBOX_OBJECT = {
-    version: fabric.version,
-    type: 'Textbox',
-    originX: 'left',
-    originY: 'top',
-    left: 0,
-    top: 0,
-    width: 120,
-    height: 202.5,
-    fill: 'rgb(0,0,0)',
-    stroke: null,
-    strokeWidth: 1,
-    strokeDashArray: null,
-    strokeLineCap: 'butt',
-    strokeDashOffset: 0,
-    strokeLineJoin: 'miter',
-    strokeMiterLimit: 4,
-    scaleX: 1,
-    scaleY: 1,
-    angle: 0,
-    flipX: false,
-    flipY: false,
-    opacity: 1,
-    shadow: null,
-    visible: true,
-    text: 'The quick \nbrown \nfox',
-    fontSize: 40,
-    fontWeight: 'normal',
-    fontFamily: 'Times New Roman',
-    fontStyle: 'normal',
-    lineHeight: 1.16,
-    underline: false,
-    overline: false,
-    linethrough: false,
-    textAlign: 'left',
-    backgroundColor: '',
-    textBackgroundColor: '',
-    fillRule: 'nonzero',
-    paintFirst: 'fill',
-    globalCompositeOperation: 'source-over',
-    skewX: 0,
-    skewY: 0,
-    charSpacing: 0,
-    styles: [
-      {
-        start: 5,
-        end: 9,
-        style: { fill: "red" }
-      },
-      {
-        start: 13,
-        end: 18,
-        style: { underline: true }
-      }
-    ],
-    minWidth: 20,
-    splitByGrapheme: false,
-    strokeUniform: false,
-    path: undefined,
-    direction: 'ltr',
-    pathStartOffset: 0,
-    pathSide: 'left',
-    pathAlign: 'baseline'
-  };
 
   QUnit.test('constructor', function(assert) {
     var textbox = new fabric.Textbox('test');
@@ -101,124 +37,6 @@
     assert.ok(fabric.Textbox.cacheProperties.indexOf('width') > -1, 'width is in cacheProperties');
   });
 
-  QUnit.test('toObject with styles', function(assert) {
-    var textbox = new fabric.Textbox('The quick \nbrown \nfox', {
-      width: 120,
-      styles: {
-        "0":{
-          "5":{fill:"red"},
-          "6":{fill:"red"},
-          "7":{fill:"red"},
-          "8":{fill:"red"}
-        },
-        "1":{
-          "3":{underline:true},
-          "4":{underline:true},
-          "5":{underline:true}
-        },
-        "2":{
-          "0":{underline:true},
-          "1":{underline:true}
-        }
-      }
-    });
-    var obj = textbox.toObject();
-    assert.deepEqual(obj, TEXTBOX_OBJECT, 'JSON OUTPUT MATCH');
-    assert.deepEqual(obj.styles, TEXTBOX_OBJECT.styles, 'stylesToArray output matches');
-    assert.deepEqual(obj.styles[0], TEXTBOX_OBJECT.styles[0], 'styles array matches at first index');
-    assert.deepEqual(obj.styles[0].style, TEXTBOX_OBJECT.styles[0].style, 'style properties match at first index');
-    assert.deepEqual(obj.styles[1], TEXTBOX_OBJECT.styles[1], 'styles array matches at second index');
-    assert.deepEqual(obj.styles[1].style, TEXTBOX_OBJECT.styles[1].style, 'style properties match at second index');
-  });
-
-  QUnit.test('stylesToArray edge case', function (assert) {
-    var textbox = new fabric.Textbox('The quick \nbrown \nfox', {
-      width: 120,
-      styles: {
-        "0": {
-          "5": { fill: "red" },
-          "6": { fill: "red" },
-          "7": { fill: "red" },
-          "8": { fill: "red" },
-          "9": { fill: "red" },
-          "10": { fill: "red" },
-        },
-        "2": {
-          "0": { fill: "red" },
-        }
-      }
-    });
-    assert.deepEqual(textbox.toObject().styles, [
-      {
-        start: 5,
-        end: 10,
-        style: { fill: "red" }
-      },
-      {
-        start: 16,
-        end: 17,
-        style: { fill: "red" }
-      }
-    ], 'stylesToArray output matches');
-  });
-
-  QUnit.test('fromObject', function(assert) {
-    var done = assert.async();
-    fabric.Textbox.fromObject(TEXTBOX_OBJECT).then(function(textbox) {
-      assert.equal(textbox.text, 'The quick \nbrown \nfox', 'properties are respected');
-      assert.ok(textbox instanceof fabric.Textbox, 'the generated object is a textbox');
-      done();
-    });
-  });
-
-  QUnit.test('fromObjectWithStyles', function(assert) {
-    var done = assert.async();
-    var textbox = new fabric.Textbox('The quick \nbrown \nfox', {
-      width: 120,
-      styles: {
-        "0":{
-          "5":{fill:"red"},
-          "6":{fill:"red"},
-          "7":{fill:"red"},
-          "8":{fill:"red"}
-        },
-        "1":{
-          "3":{underline:true},
-          "4":{underline:true},
-          "5":{underline:true}
-        },
-        "2":{
-          "0":{underline:true},
-          "1":{underline:true}
-        }
-      }
-    });
-    fabric.Textbox.fromObject(TEXTBOX_OBJECT).then(function(obj) {
-      assert.notEqual(obj.styles, textbox.styles, 'styles is a different object after initialization');
-      assert.deepEqual(obj.styles, textbox.styles, 'stylesFromArray output matches');
-      assert.deepEqual(obj.styles[0], textbox.styles[0], 'styles match at line 0');
-      assert.notEqual(obj.styles[0][5], obj.styles[0][6], 'styles are separate objects');
-      assert.deepEqual(obj.styles[0][5], textbox.styles[0][5], 'styles match at index 5');
-      assert.deepEqual(obj.styles[0][6], textbox.styles[0][6], 'styles match at index 6');
-      assert.deepEqual(obj.styles[0][7], textbox.styles[0][7], 'styles match at index 7');
-      assert.deepEqual(obj.styles[0][8], textbox.styles[0][8], 'styles match at index 8');
-      assert.deepEqual(obj.styles[1], textbox.styles[1], 'styles match at line 1');
-      assert.deepEqual(obj.styles[1][3], textbox.styles[1][3], 'styles match at index 3');
-      assert.deepEqual(obj.styles[1][4], textbox.styles[1][4], 'styles match at index 4');
-      assert.deepEqual(obj.styles[1][5], textbox.styles[1][5], 'styles match at index 5');
-      assert.deepEqual(obj.styles[2], textbox.styles[2], 'styles match at line 2');
-      assert.deepEqual(obj.styles[2][0], textbox.styles[2][0], 'styles match at index 0');
-      assert.deepEqual(obj.styles[2][1], textbox.styles[2][1], 'styles match at index 1');
-      const out = obj.toObject();
-      fabric.Textbox.fromObject(out).then(function(obj2) {
-        assert.notEqual(out.styles, obj2.styles, 'styles copy is a different object after initialization');
-        assert.notEqual(obj.styles, obj2.styles, 'styles copy is a different object after initialization');
-        assert.deepEqual(obj.styles, obj2.styles, 'styles copy is a different object after initialization');
-        done();
-      });
-    });
-  });
-
   QUnit.test('isEndOfWrapping', function(assert) {
     var textbox = new fabric.Textbox('a q o m s g\np q r s t w', {
       width: 70,
diff --git a/test/visual/text.js b/test/visual/text.js
index 053214ede..40f44a38a 100644
--- a/test/visual/text.js
+++ b/test/visual/text.js
@@ -449,7 +449,7 @@
 
   function text12(canvas, callback) {
     fabric.Text.fromObject(
-      JSON.parse('{"type":"IText","version":"4.4.0","left":1.28,"top":0.19,"width":740.57,"height":150.06,"fill":"#e38644","scaleX":0.48,"scaleY":0.48,"angle":0.2,"text":"השועל החום והזריז קופץ מעל הכלב העצלן\\nהשועל החום והזר33יז  קופץ מעל הכל העצלן\\nשלום עולם","fontWeight":"","fontFamily":"Arial","textAlign":"right","textBackgroundColor":"#d72323","direction":"rtl","styles":{"0":{"6":{"fill":"red"},"7":{"fill":"red"},"8":{"fill":"red","linethrough":true},"9":{"fill":"red","linethrough":true},"10":{"linethrough":true,"textBackgroundColor":"red"},"11":{"linethrough":true,"textBackgroundColor":"green"},"12":{"linethrough":true},"13":{"linethrough":true}},"1":{"8":{"underline":true},"9":{"underline":true},"10":{"underline":true},"11":{"underline":true},"12":{"underline":true},"13":{"underline":true,"fontSize":22},"14":{"underline":true,"fontSize":22},"15":{"underline":true,"fontSize":22},"16":{"underline":true,"fontSize":22},"17":{"fontSize":22},"18":{"fontSize":22},"19":{"fontSize":22},"20":{"fontSize":22},"21":{"fontSize":22},"22":{"fontSize":22,"textBackgroundColor":"blue"}}},"path":null}')
+      JSON.parse('{"type":"IText","version":"4.4.0","left":1.28,"top":0.19,"width":740.57,"height":150.06,"fill":"#e38644","scaleX":0.48,"scaleY":0.48,"angle":0.2,"text":"השועל החום והזריז קופץ מעל הכלב העצלן\\nהשועל החום והזר33יז  קופץ מעל הכל העצלן\\nשלום עולם","fontWeight":"normal","fontFamily":"Arial","textAlign":"right","textBackgroundColor":"#d72323","direction":"rtl","styles":{"0":{"6":{"fill":"red"},"7":{"fill":"red"},"8":{"fill":"red","linethrough":true},"9":{"fill":"red","linethrough":true},"10":{"linethrough":true,"textBackgroundColor":"red"},"11":{"linethrough":true,"textBackgroundColor":"green"},"12":{"linethrough":true},"13":{"linethrough":true}},"1":{"8":{"underline":true},"9":{"underline":true},"10":{"underline":true},"11":{"underline":true},"12":{"underline":true},"13":{"underline":true,"fontSize":22},"14":{"underline":true,"fontSize":22},"15":{"underline":true,"fontSize":22},"16":{"underline":true,"fontSize":22},"17":{"fontSize":22},"18":{"fontSize":22},"19":{"fontSize":22},"20":{"fontSize":22},"21":{"fontSize":22},"22":{"fontSize":22,"textBackgroundColor":"blue"}}},"path":null}')
     ).then(function(text) {
       canvas.add(text);
       canvas.renderAll();
diff --git a/test/visual/toDataURL.js b/test/visual/toDataURL.js
index d64df85f8..20662f878 100644
--- a/test/visual/toDataURL.js
+++ b/test/visual/toDataURL.js
@@ -35,7 +35,7 @@
     visualTestLoop = window.visualTestLoop;
   }
 
-  var canvasWithObjects = '{"version":"2.4.6","objects":[{"type":"Rect","version":"2.4.6","left":-8,"top":-11,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":50,"y2":0},"colorStops":[{"offset":0,"color":"rgb(109,67,57)","opacity":1},{"offset":1,"color":"rgb(51,167,218)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":16,"scaleY":12.18,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":13.11,"top":130.77,"width":100,"height":100,"fill":"#0ec6ba","scaleX":0.57,"scaleY":0.57,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":361.54,"top":236.84,"width":50,"height":50,"fill":"#b99503","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":119.83,"top":97.98,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":0,"y2":50},"colorStops":[{"offset":0,"color":"rgb(12,101,114)","opacity":1},{"offset":1,"color":"rgb(206,164,109)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Polygon","version":"2.4.6","left":511.04,"top":115.36,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":0},"colorStops":[{"offset":0,"color":"rgb(151,164,232)","opacity":1},{"offset":1,"color":"rgb(68,30,248)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.49,"scaleY":0.49,"angle":-24.56,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":200.83,"top":101.84,"width":150,"height":100,"stroke":"#d11594","scaleX":0.46,"scaleY":0.46,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":178.97,"top":118.55,"width":50,"height":50,"fill":"#c560ff","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":508.12,"top":23.41,"width":100,"height":100,"fill":"#033516","scaleX":0.62,"scaleY":0.62,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":108.25,"top":267.7,"width":50,"height":50,"fill":"#ceada8","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":279.26,"top":124.34,"width":100,"height":100,"fill":"#439867","scaleX":0.52,"scaleY":0.52,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":178.97,"top":213.7,"width":50,"height":50,"fill":"#a84956","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":139.11,"top":162.27,"width":150,"height":100,"stroke":"#06150b","scaleX":0.49,"scaleY":0.49,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":464.73,"top":108.91,"width":385,"height":245,"fill":"#78ef2e","stroke":"#4ea2d7","strokeWidth":3,"scaleX":0.54,"scaleY":0.54,"angle":33.18,"opacity":0.84,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":217.54,"top":289.56,"width":150,"height":100,"stroke":"#636d31","scaleX":0.98,"scaleY":0.98,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":229.11,"top":162.27,"width":50,"height":50,"fill":"#21fdd6","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":6.68,"top":52.98,"width":100,"height":100,"fill":"#aff4ab","scaleX":0.38,"scaleY":0.38,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":434.83,"top":22.12,"width":50,"height":50,"fill":"#0004f0","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":509.4,"top":94.13,"width":100,"height":100,"fill":"#d3abcf","scaleX":0.65,"scaleY":0.65,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":105.68,"top":333.27,"width":50,"height":50,"fill":"#dd30e6","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":366.69,"top":209.9,"width":150,"height":100,"stroke":"#6f48ec","scaleX":0.98,"scaleY":0.98,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":50.4,"top":138.92,"width":385,"height":245,"fill":"#e5dc30","scaleX":0.27,"scaleY":0.27,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":177.8,"top":20.96,"width":150,"height":100,"stroke":"#b99297","scaleX":0.62,"scaleY":0.62,"angle":93.47,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":178.97,"top":285.7,"width":50,"height":50,"fill":"#34c5c9","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":317.83,"top":214.98,"width":100,"height":100,"fill":"#b19c03","scaleX":0.59,"scaleY":0.59,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":245.83,"top":231.7,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":50,"y2":0},"colorStops":[{"offset":0,"color":"rgb(166,239,249)","opacity":1},{"offset":1,"color":"rgb(179,252,126)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":59.4,"top":91.55,"width":100,"height":100,"fill":"#e622ed","scaleX":0.52,"scaleY":0.52,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":65.83,"top":194.41,"width":50,"height":50,"fill":"#27592d","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":329.4,"top":31.12,"width":150,"height":100,"stroke":"#2aad0c","scaleX":1.29,"scaleY":1.29,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":113.09,"top":31.26,"width":385,"height":245,"fill":"#9f018a","scaleX":0.28,"scaleY":0.28,"angle":103.34,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Polygon","version":"2.4.6","left":277.69,"top":84.15,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":0},"colorStops":[{"offset":0,"color":"rgb(191,3,90)","opacity":1},{"offset":1,"color":"rgb(89,41,35)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.55,"scaleY":0.55,"opacity":0.78,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Rect","version":"2.4.6","left":168.68,"top":35.62,"width":50,"height":50,"fill":"#2b14e3","scaleX":1.07,"scaleY":1.07,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":230.4,"top":20.84,"width":100,"height":100,"fill":"#d4a8de","scaleX":1.02,"scaleY":1.02,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":112.81,"top":63.77,"width":50,"height":50,"fill":"#d9df91","scaleX":0.87,"scaleY":0.87,"angle":176.42,"opacity":0.8},{"type":"line","version":"2.4.6","left":9.25,"top":181.55,"width":150,"height":100,"stroke":"#54d6b2","scaleX":0.39,"scaleY":0.39,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":156.91,"top":335.97,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":245},"colorStops":[{"offset":0,"color":"rgb(227,86,178)","opacity":1},{"offset":1,"color":"rgb(229,227,6)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.39,"scaleY":0.39,"angle":142.19,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Triangle","version":"2.4.6","left":6.68,"top":208.56,"width":50,"height":50,"fill":"#8eab91","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":123.68,"top":191.2,"width":100,"height":100,"fill":"#85ddb5","scaleX":0.69,"scaleY":0.69,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":7.97,"top":18.27,"width":50,"height":50,"fill":"#794b0d","scaleX":0.63,"scaleY":0.63,"opacity":0.8},{"type":"Text","version":"2.4.6","left":383.24,"top":307.83,"width":598.13,"height":359.79,"fill":"#96062c","scaleX":0.32,"scaleY":0.32,"angle":9,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et dolore magna aliqua.\\nUt enim ad minim veniam,\\nquis nostrud exercitation ullamco\\nlaboris nisi ut ","fontWeight":"","fontFamily":"helvetica","styles":{}},{"type":"Text","version":"2.4.6","left":617.41,"top":29.52,"width":598.13,"height":307.36,"fill":"#67586c","scaleX":0.23,"scaleY":0.23,"angle":-7,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et dolore magna aliqua.\\nUt enim ad minim veniam,\\nquis nostrud exer","fontWeight":"","fontFamily":"helvetica","styles":{}},{"type":"Rect","version":"2.4.6","left":238.11,"top":355.13,"width":50,"height":50,"fill":"#f1750c","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":310.11,"top":299.2,"width":100,"height":100,"fill":"#b091e0","scaleX":0.53,"scaleY":0.53,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Text","version":"2.4.6","left":24.92,"top":399.49,"width":598.13,"height":202.5,"fill":"#1a11a8","scaleX":0.28,"scaleY":0.24,"angle":8,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et","fontWeight":"","fontFamily":"helvetica","styles":{}},{"type":"Triangle","version":"2.4.6","left":186.68,"top":357.7,"width":50,"height":50,"fill":"#312567","scaleX":0.63,"scaleY":1.29,"opacity":0.8},{"type":"Group","version":"2.4.6","left":583.32,"top":203.28,"width":151,"height":151,"scaleX":0.41,"scaleY":0.41,"angle":7,"objects":[{"type":"Path","version":"2.4.6","left":-75.68,"top":-75.56,"width":150.01,"height":150.01,"fill":"#5E0000","path":[["M",121.32,0],["L",44.58,0],["C",36.67,0,29.5,3.22,24.31,8.41],["c",-5.19,5.19,-8.41,12.37,-8.41,20.28],["c",0,15.82,12.87,28.69,28.69,28.69],["c",0,0,4.4,0,7.48,0],["C",36.66,72.78,8.4,101.04,8.4,101.04],["C",2.98,106.45,0,113.66,0,121.32],["c",0,7.66,2.98,14.87,8.4,20.29],["l",0,0],["c",5.42,5.42,12.62,8.4,20.28,8.4],["c",7.66,0,14.87,-2.98,20.29,-8.4],["c",0,0,28.26,-28.25,43.66,-43.66],["c",0,3.08,0,7.48,0,7.48],["c",0,15.82,12.87,28.69,28.69,28.69],["c",7.66,0,14.87,-2.99,20.29,-8.4],["c",5.42,-5.42,8.4,-12.62,8.4,-20.28],["l",0,-76.74],["c",0,-7.66,-2.98,-14.87,-8.4,-20.29],["C",136.19,2.98,128.98,0,121.32,0],["z"]]},{"type":"Path","version":"2.4.6","left":-68.09,"top":-67.97,"width":134.83,"height":134.83,"fill":"#961B1E","path":[["M",142.42,105.43],["V",28.69],["c",0,-11.65,-9.45,-21.1,-21.1,-21.1],["H",44.58],["c",-11.65,0,-21.1,9.45,-21.1,21.1],["s",9.45,21.1,21.1,21.1],["h",25.79],["L",13.77,106.4],["c",-8.24,8.24,-8.24,21.6,0,29.84],["c",8.24,8.24,21.6,8.24,29.84,0],["l",56.61,-56.61],["v",25.79],["c",0,11.65,9.45,21.1,21.1,21.1],["C",132.97,126.53,142.42,117.08,142.42,105.43],["z"]]}]},{"type":"Rect","version":"2.4.6","left":538.98,"top":308.2,"width":50,"height":50,"fill":"#f75873","scaleX":0.92,"scaleY":0.92,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":644.41,"top":153.27,"width":100,"height":100,"fill":"#66df30","scaleX":0.83,"scaleY":0.83,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":297.26,"top":378.27,"width":50,"height":50,"fill":"#85d3e3","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Triangle","version":"2.4.6","left":587.83,"top":267.7,"width":50,"height":50,"fill":"#99a934","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":205.97,"top":430.99,"width":50,"height":50,"fill":"#d1ab33","scaleX":1.42,"scaleY":1.42,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":718.98,"top":88.98,"width":50,"height":50,"fill":"#649cf2","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":63.25,"top":450.27,"width":100,"height":100,"fill":"#787bd8","scaleX":0.74,"scaleY":0.74,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":571.12,"top":362.84,"width":50,"height":50,"fill":"#1a7f06","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":285.69,"top":450.27,"width":100,"height":100,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":0,"y2":100},"colorStops":[{"offset":0,"color":"rgb(103,118,26)","opacity":1},{"offset":1,"color":"rgb(164,77,104)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.67,"scaleY":0.67,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Polygon","version":"2.4.6","left":328.11,"top":433.39,"width":385,"height":245,"fill":"#ee833f","scaleX":0.43,"scaleY":0.43,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Circle","version":"2.4.6","left":446.4,"top":432.27,"width":100,"height":100,"fill":"#4ac9fa","scaleX":0.5,"scaleY":0.5,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Textbox","version":"2.4.6","left":16.97,"top":538.99,"width":674.96,"height":48.82,"fill":"#722561","scaleX":1.19,"scaleY":1.19,"text":"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut la","fontSize":20,"fontWeight":"","fontFamily":"helvetica","minWidth":20,"styles":{}},{"type":"Rect","version":"2.4.6","left":500.4,"top":470.84,"width":50,"height":50,"fill":"#a51907","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":652.12,"top":238.13,"width":100,"height":100,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":100,"y2":0},"colorStops":[{"offset":0,"color":"rgb(29,69,103)","opacity":1},{"offset":1,"color":"rgb(206,159,161)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":727.98,"top":167.41,"width":50,"height":50,"fill":"#9f2237","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Polygon","version":"2.4.6","left":568.55,"top":414.95,"width":385,"height":245,"fill":"#ba0975","scaleX":0.48,"scaleY":0.48,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Circle","version":"2.4.6","left":558.26,"top":433.56,"width":100,"height":100,"fill":"#869412","scaleX":0.46,"scaleY":0.46,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Circle","version":"2.4.6","left":675.26,"top":377.63,"width":100,"height":100,"fill":"#1a6248","scaleX":0.75,"scaleY":0.75,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":711.26,"top":472.13,"width":50,"height":50,"fill":"#6acbfa","scaleX":1.29,"scaleY":1.29,"opacity":0.8}]}';
+  var canvasWithObjects = '{"version":"2.4.6","objects":[{"type":"Rect","version":"2.4.6","left":-8,"top":-11,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":50,"y2":0},"colorStops":[{"offset":0,"color":"rgb(109,67,57)","opacity":1},{"offset":1,"color":"rgb(51,167,218)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":16,"scaleY":12.18,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":13.11,"top":130.77,"width":100,"height":100,"fill":"#0ec6ba","scaleX":0.57,"scaleY":0.57,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":361.54,"top":236.84,"width":50,"height":50,"fill":"#b99503","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":119.83,"top":97.98,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":0,"y2":50},"colorStops":[{"offset":0,"color":"rgb(12,101,114)","opacity":1},{"offset":1,"color":"rgb(206,164,109)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Polygon","version":"2.4.6","left":511.04,"top":115.36,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":0},"colorStops":[{"offset":0,"color":"rgb(151,164,232)","opacity":1},{"offset":1,"color":"rgb(68,30,248)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.49,"scaleY":0.49,"angle":-24.56,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":200.83,"top":101.84,"width":150,"height":100,"stroke":"#d11594","scaleX":0.46,"scaleY":0.46,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":178.97,"top":118.55,"width":50,"height":50,"fill":"#c560ff","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":508.12,"top":23.41,"width":100,"height":100,"fill":"#033516","scaleX":0.62,"scaleY":0.62,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":108.25,"top":267.7,"width":50,"height":50,"fill":"#ceada8","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":279.26,"top":124.34,"width":100,"height":100,"fill":"#439867","scaleX":0.52,"scaleY":0.52,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":178.97,"top":213.7,"width":50,"height":50,"fill":"#a84956","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":139.11,"top":162.27,"width":150,"height":100,"stroke":"#06150b","scaleX":0.49,"scaleY":0.49,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":464.73,"top":108.91,"width":385,"height":245,"fill":"#78ef2e","stroke":"#4ea2d7","strokeWidth":3,"scaleX":0.54,"scaleY":0.54,"angle":33.18,"opacity":0.84,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":217.54,"top":289.56,"width":150,"height":100,"stroke":"#636d31","scaleX":0.98,"scaleY":0.98,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":229.11,"top":162.27,"width":50,"height":50,"fill":"#21fdd6","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":6.68,"top":52.98,"width":100,"height":100,"fill":"#aff4ab","scaleX":0.38,"scaleY":0.38,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":434.83,"top":22.12,"width":50,"height":50,"fill":"#0004f0","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":509.4,"top":94.13,"width":100,"height":100,"fill":"#d3abcf","scaleX":0.65,"scaleY":0.65,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":105.68,"top":333.27,"width":50,"height":50,"fill":"#dd30e6","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":366.69,"top":209.9,"width":150,"height":100,"stroke":"#6f48ec","scaleX":0.98,"scaleY":0.98,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":50.4,"top":138.92,"width":385,"height":245,"fill":"#e5dc30","scaleX":0.27,"scaleY":0.27,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"line","version":"2.4.6","left":177.8,"top":20.96,"width":150,"height":100,"stroke":"#b99297","scaleX":0.62,"scaleY":0.62,"angle":93.47,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Triangle","version":"2.4.6","left":178.97,"top":285.7,"width":50,"height":50,"fill":"#34c5c9","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":317.83,"top":214.98,"width":100,"height":100,"fill":"#b19c03","scaleX":0.59,"scaleY":0.59,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":245.83,"top":231.7,"width":50,"height":50,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":50,"y2":0},"colorStops":[{"offset":0,"color":"rgb(166,239,249)","opacity":1},{"offset":1,"color":"rgb(179,252,126)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":59.4,"top":91.55,"width":100,"height":100,"fill":"#e622ed","scaleX":0.52,"scaleY":0.52,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":65.83,"top":194.41,"width":50,"height":50,"fill":"#27592d","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"line","version":"2.4.6","left":329.4,"top":31.12,"width":150,"height":100,"stroke":"#2aad0c","scaleX":1.29,"scaleY":1.29,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":113.09,"top":31.26,"width":385,"height":245,"fill":"#9f018a","scaleX":0.28,"scaleY":0.28,"angle":103.34,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Polygon","version":"2.4.6","left":277.69,"top":84.15,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":0},"colorStops":[{"offset":0,"color":"rgb(191,3,90)","opacity":1},{"offset":1,"color":"rgb(89,41,35)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.55,"scaleY":0.55,"opacity":0.78,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Rect","version":"2.4.6","left":168.68,"top":35.62,"width":50,"height":50,"fill":"#2b14e3","scaleX":1.07,"scaleY":1.07,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":230.4,"top":20.84,"width":100,"height":100,"fill":"#d4a8de","scaleX":1.02,"scaleY":1.02,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":112.81,"top":63.77,"width":50,"height":50,"fill":"#d9df91","scaleX":0.87,"scaleY":0.87,"angle":176.42,"opacity":0.8},{"type":"line","version":"2.4.6","left":9.25,"top":181.55,"width":150,"height":100,"stroke":"#54d6b2","scaleX":0.39,"scaleY":0.39,"x1":-75,"x2":75,"y1":-50,"y2":50},{"type":"Polygon","version":"2.4.6","left":156.91,"top":335.97,"width":385,"height":245,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":385,"y2":245},"colorStops":[{"offset":0,"color":"rgb(227,86,178)","opacity":1},{"offset":1,"color":"rgb(229,227,6)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.39,"scaleY":0.39,"angle":142.19,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Triangle","version":"2.4.6","left":6.68,"top":208.56,"width":50,"height":50,"fill":"#8eab91","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":123.68,"top":191.2,"width":100,"height":100,"fill":"#85ddb5","scaleX":0.69,"scaleY":0.69,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":7.97,"top":18.27,"width":50,"height":50,"fill":"#794b0d","scaleX":0.63,"scaleY":0.63,"opacity":0.8},{"type":"Text","version":"2.4.6","left":383.24,"top":307.83,"width":598.13,"height":359.79,"fill":"#96062c","scaleX":0.32,"scaleY":0.32,"angle":9,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et dolore magna aliqua.\\nUt enim ad minim veniam,\\nquis nostrud exercitation ullamco\\nlaboris nisi ut ","fontWeight":"normal","fontFamily":"helvetica","styles":{}},{"type":"Text","version":"2.4.6","left":617.41,"top":29.52,"width":598.13,"height":307.36,"fill":"#67586c","scaleX":0.23,"scaleY":0.23,"angle":-7,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et dolore magna aliqua.\\nUt enim ad minim veniam,\\nquis nostrud exer","fontWeight":"normal","fontFamily":"helvetica","styles":{}},{"type":"Rect","version":"2.4.6","left":238.11,"top":355.13,"width":50,"height":50,"fill":"#f1750c","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":310.11,"top":299.2,"width":100,"height":100,"fill":"#b091e0","scaleX":0.53,"scaleY":0.53,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Text","version":"2.4.6","left":24.92,"top":399.49,"width":598.13,"height":202.5,"fill":"#1a11a8","scaleX":0.28,"scaleY":0.24,"angle":8,"text":"Lorem ipsum dolor sit amet,\\nconsectetur adipisicing elit,\\nsed do eiusmod tempor incididunt\\nut labore et","fontWeight":"normal","fontFamily":"helvetica","styles":{}},{"type":"Triangle","version":"2.4.6","left":186.68,"top":357.7,"width":50,"height":50,"fill":"#312567","scaleX":0.63,"scaleY":1.29,"opacity":0.8},{"type":"Group","version":"2.4.6","left":583.32,"top":203.28,"width":151,"height":151,"scaleX":0.41,"scaleY":0.41,"angle":7,"objects":[{"type":"Path","version":"2.4.6","left":-75.68,"top":-75.56,"width":150.01,"height":150.01,"fill":"#5E0000","path":[["M",121.32,0],["L",44.58,0],["C",36.67,0,29.5,3.22,24.31,8.41],["c",-5.19,5.19,-8.41,12.37,-8.41,20.28],["c",0,15.82,12.87,28.69,28.69,28.69],["c",0,0,4.4,0,7.48,0],["C",36.66,72.78,8.4,101.04,8.4,101.04],["C",2.98,106.45,0,113.66,0,121.32],["c",0,7.66,2.98,14.87,8.4,20.29],["l",0,0],["c",5.42,5.42,12.62,8.4,20.28,8.4],["c",7.66,0,14.87,-2.98,20.29,-8.4],["c",0,0,28.26,-28.25,43.66,-43.66],["c",0,3.08,0,7.48,0,7.48],["c",0,15.82,12.87,28.69,28.69,28.69],["c",7.66,0,14.87,-2.99,20.29,-8.4],["c",5.42,-5.42,8.4,-12.62,8.4,-20.28],["l",0,-76.74],["c",0,-7.66,-2.98,-14.87,-8.4,-20.29],["C",136.19,2.98,128.98,0,121.32,0],["z"]]},{"type":"Path","version":"2.4.6","left":-68.09,"top":-67.97,"width":134.83,"height":134.83,"fill":"#961B1E","path":[["M",142.42,105.43],["V",28.69],["c",0,-11.65,-9.45,-21.1,-21.1,-21.1],["H",44.58],["c",-11.65,0,-21.1,9.45,-21.1,21.1],["s",9.45,21.1,21.1,21.1],["h",25.79],["L",13.77,106.4],["c",-8.24,8.24,-8.24,21.6,0,29.84],["c",8.24,8.24,21.6,8.24,29.84,0],["l",56.61,-56.61],["v",25.79],["c",0,11.65,9.45,21.1,21.1,21.1],["C",132.97,126.53,142.42,117.08,142.42,105.43],["z"]]}]},{"type":"Rect","version":"2.4.6","left":538.98,"top":308.2,"width":50,"height":50,"fill":"#f75873","scaleX":0.92,"scaleY":0.92,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":644.41,"top":153.27,"width":100,"height":100,"fill":"#66df30","scaleX":0.83,"scaleY":0.83,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":297.26,"top":378.27,"width":50,"height":50,"fill":"#85d3e3","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Triangle","version":"2.4.6","left":587.83,"top":267.7,"width":50,"height":50,"fill":"#99a934","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":205.97,"top":430.99,"width":50,"height":50,"fill":"#d1ab33","scaleX":1.42,"scaleY":1.42,"opacity":0.8},{"type":"Rect","version":"2.4.6","left":718.98,"top":88.98,"width":50,"height":50,"fill":"#649cf2","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":63.25,"top":450.27,"width":100,"height":100,"fill":"#787bd8","scaleX":0.74,"scaleY":0.74,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Rect","version":"2.4.6","left":571.12,"top":362.84,"width":50,"height":50,"fill":"#1a7f06","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":285.69,"top":450.27,"width":100,"height":100,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":0,"y2":100},"colorStops":[{"offset":0,"color":"rgb(103,118,26)","opacity":1},{"offset":1,"color":"rgb(164,77,104)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":0.67,"scaleY":0.67,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Polygon","version":"2.4.6","left":328.11,"top":433.39,"width":385,"height":245,"fill":"#ee833f","scaleX":0.43,"scaleY":0.43,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Circle","version":"2.4.6","left":446.4,"top":432.27,"width":100,"height":100,"fill":"#4ac9fa","scaleX":0.5,"scaleY":0.5,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Textbox","version":"2.4.6","left":16.97,"top":538.99,"width":674.96,"height":48.82,"fill":"#722561","scaleX":1.19,"scaleY":1.19,"text":"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut la","fontSize":20,"fontWeight":"normal","fontFamily":"helvetica","minWidth":20,"styles":{}},{"type":"Rect","version":"2.4.6","left":500.4,"top":470.84,"width":50,"height":50,"fill":"#a51907","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Circle","version":"2.4.6","left":652.12,"top":238.13,"width":100,"height":100,"fill":{"type":"linear","coords":{"x1":0,"y1":0,"x2":100,"y2":0},"colorStops":[{"offset":0,"color":"rgb(29,69,103)","opacity":1},{"offset":1,"color":"rgb(206,159,161)","opacity":1}],"offsetX":0,"offsetY":0},"scaleX":1.29,"scaleY":1.29,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":727.98,"top":167.41,"width":50,"height":50,"fill":"#9f2237","scaleX":1.29,"scaleY":1.29,"opacity":0.8},{"type":"Polygon","version":"2.4.6","left":568.55,"top":414.95,"width":385,"height":245,"fill":"#ba0975","scaleX":0.48,"scaleY":0.48,"points":[{"x":185,"y":0},{"x":250,"y":100},{"x":385,"y":170},{"x":0,"y":245}]},{"type":"Circle","version":"2.4.6","left":558.26,"top":433.56,"width":100,"height":100,"fill":"#869412","scaleX":0.46,"scaleY":0.46,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Circle","version":"2.4.6","left":675.26,"top":377.63,"width":100,"height":100,"fill":"#1a6248","scaleX":0.75,"scaleY":0.75,"opacity":0.8,"radius":50,"startAngle":0,"endAngle":360},{"type":"Triangle","version":"2.4.6","left":711.26,"top":472.13,"width":50,"height":50,"fill":"#6acbfa","scaleX":1.29,"scaleY":1.29,"opacity":0.8}]}';
 
   var tests = [];