The updates will work if you do not do them in place but with the help of a temporary table:
CREATE TEMP TABLE t2 AS SELECT * FROM tests WHERE num >= 0;
DELETE FROM tests WHERE num >= 0;
INSERT INTO tests SELECT num + 1, value FROM t2;
DROP TABLE t2;
Alternatively, use an increment that is large enough that there will be no conflicts. You have then to do this again to get back to the desired values:
UPDATE tests SET num = num + 3 WHERE num >= 0;
UPDATE tests SET num = num - 3 + 1 WHERE num - 3 >= 0;